在s2sh开发的时候遇到了一个问题就是在dao层获取连接的时候,循环调用一个查询方法导致连接没有被关闭,最后连接池的连接耗尽
之前是这样写的:
public String findDate(String thisDate, String indecode) {
String str = "";
try {
String sql = "select sum(valuer) from jc_jp_indedatam where "
+ " indecode='" + indecode + "' and cycdata=to_date('"
+ thisDate + "','yyyy-mm')";
List<String> obj = (List<String>) getSessions().createSQLQuery(sql);
if (obj != null && obj.size() > 0) {
str = obj.get(0);
}
} catch (RuntimeException re) {
throw re;
}
return str;
}
我dao类继承的是HibernateDaoSupport
使用的是getSession()这种获取连接的方式相当于是调用haiberante底层的连接,这个spring是不会管理这个连接的最后导致连接没有关闭
我直接修改为:
public String findDate(String thisDate, String indecode) {String str = "";
try {
final String sql = "select sum(valuer) from jc_jp_indedatam where "
+ " indecode='" + indecode + "' and cycdata=to_date('"
+ thisDate + "','yyyy-mm')";
List<String> obj = (List<String>) getHibernateTemplate().execute(new HibernateCallback(){
public List<String> doInHibernate(Session arg0)
throws HibernateException, SQLException {
return arg0.createSQLQuery(sql).list();
}
});
if (obj != null && obj.size() > 0) {
str = obj.get(0);
}
} catch (RuntimeException re) {
throw re;
}
return str;
}
修改后的:我把他改成getHibernateTemplate()之后就能正常关闭连接了,原因是getHibernateTemplate()是spring的提供的
ps:有些人会想getSessions()如果不关闭的话,我手动使用close关闭不行吗?我在网上看了很多有些人说行,有些人说不行,但是我试了一下好像是关闭不了,个人建议既然我们使用了spring那就直接用spring提供的一些方法或者是类这样跟方便于spring管理,也实现了使用spring的初衷.