当前位置:编程学习 > XML/UML >>

请慎用spring-ClassPathXmlApplicationContext手动加载spring配置文件

在用spring做数据源配置的时候,如果代码中有用ClassPathXmlApplicationContext去加载spring配置文件,那么每次运行到此处代码,spring都会重新获得一个数据库连接。
 
如果浏览量太大就会导致超出数据库连接会话上写的错误,比如oracle会报出ORA-12519错误,临时修改数据库连接数治标不治本。
 
处理方式;
 
1、将需要用ClassPathXmlApplicationContext手动加载spring文件的类放到spring配置文件中去实例化,禁用ClassPathXmlApplicationContext直接调用。
 
2、将ClassPathXmlApplicationContext加载spring文件放到全局常量中(static标识)。
 
3、使用WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext)在服务器启动时候直接加载web.xml配置中的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 (SpringDBInit.class)  
            {  
                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  
    {  
        /* 
         * LogFactory.getInstance().logRun(RunPriority.INFORMATIONAL, 
         * LogConstants.sysLogConstants.INT_SPRING_START, null ); 
         */  
        try  
        {  
            ServletContext servletContext = (ServletContext) props  
                .get("APP_CONTEXT");  
            if (servletContext != null)  
                ctx = WebApplicationContextUtils  
                    .getRequiredWebApplicationContext(servletContext);  
        }  
  
        catch (Exception e)  
        {  
            e.printStackTrace();  
  
        }  
        if ((ctx == null) || (ctx.getBeanDefinitionNames().length == 0))  
        {  
  
        }  
  
    }  
  
    /** 
     * 得到一个spring的配置对象 
     *  
     * @param name 
     * @return 
     */  
    public Object getBean(String name)  
    {  
        if (ctx == null)  
            return null;  
        else  
            return ctx.getBean(name);  
    }  
  
    /** 
     * 获取单个信息 
     *  
     * @param key 
     * @param object 
     * @param request 
     * @return 
     */  
    public static String getMessage(String key, Object[] object, Locale locale)  
    {  
        return ctx.getMessage(key, object, locale);  
    }  
}  
 
[java] 
public class SpringDBUtil  
{  
    /** 
     * sjb管理类实例 
     */  
    private static SpringDBInit sdb = SpringDBInit.getInstance();  
  
    /** 
     * 得到一个系统配置 bean 
     *  
     * @param name bean的配置名称 
     * @return 如果系统没有加载返回 null 
     */  
    public static Object getBean(String name)  
    {  
        return sdb.getBean(name);  
    }  
}  
 
[java] 
public class SpringInitServlet  
    extends HttpServlet  
{  
  
    static final long serialVersionUID = -1111516993124229949L;  
  
    /** 
     * 启动对象实例 
     */  
    private SpringDBInit sdbinit = SpringDBInit.getInstance();  
补充:软件开发 , Java ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,