在用spring做数据源配置的时候如果代码中有用ClassPathXmlApplicationContext去加载spring配置文件那么每次运行到此处代码spring都会重新获得一个数据库连接
如果浏览量太大就会导致超出数据库连接会话上写的错误比如oracle会报出ORA错误临时修改数据库连接数治标不治本
处理方式:将需要用ClassPathXmlApplicationContext手动加载spring文件的类放到spring配置文件中去实例化禁用ClassPathXmlApplicationContext直接调用
将ClassPathXmlApplicationContext加载spring文件放到全局常量中(static标识)
使用WebApplicationContextUtilsgetRequiredWebApplicationContext(servletContext)在服务器启动时候直接加载webxml配置中的spring配置文件
推荐第三种并做详细介绍
[java]
public class SpringDBInit
{
/**
* 系统应用spring环境
*/
private static ApplicationContext ctx;
/**
* 单实例对象
*/
private static SpringDBInit instance = null;
private SpringDBInit()
{
}
/**
* 获得单实例对象
*
* @return
*/
public static SpringDBInit getInstance()
{
if (instance == null)
{
synchronized (SpringDBInitclass)
{
if (instance == null)
{
instance = new SpringDBInit()
}
}
}
return instance;
}
/**
* 初始化Spring组件
*/
public void init(Properties props)
throws Exception
{
loadContextXML(props)
}
/**
* 加载spring对象
*
* @param props
*/
private void loadContextXML(Properties props)
throws Exception
{
/*
* LogFactorygetInstance()logRun(RunPriorityINFORMATIONAL
* LogConstantssysLogConstantsINT_SPRING_START null )
*/
try
{
ServletContext servletContext = (ServletContext) props
get(APP_CONTEXT)
if (servletContext != null)
ctx = WebApplicationContextUtils
getRequiredWebApplicationContext(servletContext)
}
catch (Exception e)
{
eprintStackTrace()
}
if ((ctx == null) || (ctxgetBeanDefinitionNames()length == ))
{
}
}
/**
* 得到一个spring的配置对象
*
* @param name
* @return
*/
public Object getBean(String name)
{
if (ctx == null)
return null;
else
return ctxgetBean(name)
}
/**
* 获取单个信息
*
* @param key
* @param object
* @param request
* @return
*/
public static String getMessage(String key Object[] object Locale locale)
{
return ctxgetMessage(key object locale)
}
}
[java]
public class SpringDBUtil
{
/**
* sjb管理类实例
*/
private static SpringDBInit sdb = SpringDBInitgetInstance()
/**
* 得到一个系统配置 bean
*
* @param name bean的配置名称
* @return 如果系统没有加载返回 null
*/
public static Object getBean(String name)
{
return sdbgetBean(name)
}
}
[java]
public class SpringInitServlet
extends HttpServlet
{
static final long serialVersionUID = L;
/**
* 启动对象实例
*/
private SpringDBInit sdbinit = SpringDBInitgetInstance()
/**
* servlet初始化
*/
public void init(ServletConfig config)
throws ServletException
{
superinit(config)
Properties props = new Properties()
propsput(APP_CONTEXT configgetServletContext())
// 文件路径
String prefix = getServletContext()getRealPath(/)
// web应用路径
propsput(APP_PATH prefix)
try
{
sdbinitinit(props)
}
catch (Exception e)
{
}
}
}
webxml配置[html]
<servlet>
<servletname>springInitServlet</servletname>
<servletclass>compandautilspringDBSpringInitServlet</servletclass>
<loadonstartup></loadonstartup>
</servlet>