数据库连接池中too many connetctions

问题描述:   

使用servlet+mybatis+spring+c3p0连接池程序运行一会数据库连接池就会崩掉。

报错too many connections;

 原来一直认为是连接池配置的问题。把最大连接数修改为1000也是崩(在本机一台电脑测试跑)

从c3p0换成了durid也是存在同样问题。

问题代码:

到最后才发现是自己逻辑上的问题,看原来代码:

ApplicationContext application= new ClassPathXmlApplicationContext("spring-mybatis.xml");
ArticleService artservice = (ArticleService) application.getBean("articleservice");
//省略业务逻辑的DB操作

因为我每次执行一个DB操作都是要重写建一个bean工厂,重新建一个连接池。

这导致每次在密集的请求下,会出现大量的连接池,而每个连接池有保持这自己固定数量的连接数。就会成功把数据库连接资源跑死。就连cmd也不能打开数据库。

解决思路:

   需要把bean 工厂单例出来,只产生一个工厂,这样数据库连接池也就唯一。不会出现没有用到连接池还在占用资源的问题。

解决办法:

   1.通过单例生成工厂:

public class GetClass {
	private static final ApplicationContext application= new ClassPathXmlApplicationContext("spring-mybatis.xml");
	private static final ArticleService artservice = (ArticleService) application.getBean("articleservice");
	private static final UserService userservice=(UserService) application.getBean("userservice");
	public GetClass() {
	}
	public static ApplicationContext getApplication() {
		return application;
	}
	public static UserService getUserService() {
		return userservice;
	}
	public static ArticleService getArticleService() {
		return artservice;
	}
}

我单独抽出来一个类来生产类;

2.通过监听器去产生工厂,需要在web.xml中配置 


      org.springframework.web.context.ContextLoaderListener
  
  
      contextConfigLocation
      classpath:spring-mybatis.xml
  

获取工厂即工厂的bean

ApplicationContext context =WebApplicationContextUtils.getWebApplicationContext(getServletContext());
ArticleService art = (ArticleService) context.getBean("articleservice");

这样也是通过单例去获取到的bean。

你可能感兴趣的:(JAVA,DeBug)