Spring + Hibernate 整合时数据库连接数过多问题的解决办法

用Spring + Hibernate 整合查询数据库的页面如下所示:

这个图中的页面里,有两个查询,一个是查询节目时刻表,一个是查询频道(图中下方的下拉列表框里的频道就是从数据库查出来的)

每刷新几下该页面,数据库就死掉了,用如下命令查看了连接数,发现连接数很多:

select count(*) from v$session;

经过研究,发现原因如下:

我这个程序中,action层调用service层(业务层),业务层又调用DAO层。

我在每个service里面都去通过new ClassPathXmlApplicationContext() 的方法来取得一个容器,从容器中取得dao,这样调用多少次service就new出多少个容器,就取得多少个dao,连接数自然就大了。

 

解决办法:

将dao通过spring注入给service,而不是在service里面去new一个容器进而得到dao了。这样的话相当于没有领会IOC的精神。

 

那么action里面如何得到service呢?注意也不要去new ClassPathXmlApplicationContext(),写一个单例类,来取得容器。代码如下:

 

package cn.com.pattek.util.utilzx;

import org.springframework.context.ApplicationContext;

import cn.com.pattek.core.Application;
import cn.com.pattek.core.container.SpringContainer;

public class SingletonBeanCreater {
 private static ApplicationContext ctx = null;
 
 private static SingletonBeanCreater getter;
 
 private SingletonBeanCreater(){
  
 }
 
 public static SingletonBeanCreater getInstance(){
  if(getter == null){
   getter = new SingletonBeanCreater();
  }
  return getter;
 }
 
 public Object getBean(String name) {
  if (ctx == null) {
   initSpringConfig();
  }
  return ctx.getBean(name);
 }

 public void initSpringConfig() {

  try {
   if (ctx == null) {
    SpringContainer container =(SpringContainer) Application.getInstance().getContainer();
    ctx = container.getApplicationContext();

   }
  } catch (Exception e) {
   e.printStackTrace();
   System.exit(0);
  }
 }
}
这样在action中可以这样取得service:

private TopicTaskService topicTaskService = (TopicTaskService)SingletonBeanCreater.getInstance().getBean("topicTaskService");

而service的代码就非常非常的纯净,没有跟dao相耦合。

你可能感兴趣的:(SSH整合)