关于ClassPathApplicationContext产生的toomanyconnectios的问题?

2017-01-10 10:03:41来源:oschina作者:费氏家族人点击

最近在做一款爬虫项目,由于数据量大,添加操作insert也比较频繁,众所周知,产生too many connections 的直接原因是因为数据库提供的连接被全部占满了。数据库可以提供多少连接,可以再my.cnf(Linux)或者my.ini(windows)下设定。这个直接原因的上一次原因是引用程序占据连接不释放。至于为何不释放,那就是各个应用程序的具体问题了。


下面再说说我遇到的问题吧:在爬虫逻辑中我采用的是webmagic框架,每次启用爬虫的时候都会执行一下这个操作,因为是用spring来管理的 ,之前 使用注释的代码获取applicationContext 但是这个会造成一个问题;每初始化一个spring管理容器,就会初始化一个数据库连接池,也就是(以上面配置的数据库连接池最小连接数为例)说,会占据20个数据库提供的线程,而且除非停掉tomcat,否则不会释放。这种情况下,若采用ClassPathApplicationContext,这种方式来开启一个spring容器,那么,而程序又是要被周期性调度执行,那么数据库的连接数无论被设为多大都没用。时间一长,就会出现too many connections的错误,这样 你数据库就算是 设置再大的connections 也没有用


ApplicationContext applicationContext = SpringContextUtil.getApplicationContext(); //ApplicationContextapplicationContext = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");AnhuiNewsDoor door = applicationContext.getBean(AnhuiNewsDoor.class);



之前 爬去一次大概需要耗费100多连接 一直爬去 存储 大概3次左右 就出现too many connections异常,之后我自己封装一个类 获取context 此问题得到圆满解决。


SpringContextUtil代码如下:(当然这个也可以支持往普通类注入spring管理的类,tomcat启动之后spring容器自动就被加载)


package com.farseer.factory;


import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware;


public class SpringContextUtil implements ApplicationContextAware {// Spring应用上下文环境private static ApplicationContext applicationContext;/** * 实现ApplicationContextAware接口的回调方法,设置上下文环境 ** @param applicationContext */public void setApplicationContext(ApplicationContext applicationContext) {SpringContextUtil.applicationContext = applicationContext;}/** * @return ApplicationContext */public static ApplicationContext getApplicationContext() {return applicationContext;}/** * 获取对象 ** @param name * @return Object * @throws BeansException */public static Object getBean(String name) throws BeansException { System.out.println("applicationContext:"+applicationContext); return applicationContext.getBean(name);}}

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台