Spring+Hibernate+c3p0连接池配置-连接无法释放的问题解决方案
1、Spring+Hibernate+c3p0连接池配置:
public class ArticleDaoImpl implements ArticleDao {private HibernateTemplate hibernateTemplate;public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {this.hibernateTemplate = hibernateTemplate;}public List findAllArticle(int uid) {String sql="select * from article where auid="+uid+" and (asid=1 or asid=3 or asid=5)";/* 使用这种方式得到的线程不会自动关闭,当开启次数过多时,会抛出异常,导致整个程序被挂起*/Session session=hibernateTemplate.getSessionFactory().openSession();SQLQuery query=session.createSQLQuery(sql).addEntity(article.class);List articleList=query.list(); return articleList;}
}
3、报错时候的日志信息:
public class ArticleDaoImpl implements ArticleDao {private HibernateTemplate hibernateTemplate;public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {this.hibernateTemplate = hibernateTemplate;}public List findAllArticle(int uid) {String sql="select * from article where auid="+uid+" and (asid=1 or asid=3 or asid=5)";Session session=hibernateTemplate.getSessionFactory().getCurrentSession();/* Session session=hibernateTemplate.getSessionFactory().openSession();* 使用这种方式得到的线程不会自动关闭,当开启次数过多时,会抛出异常,导致整个程序被挂起*/SQLQuery query=session.createSQLQuery(sql).addEntity(article.class);List articleList=query.list(); return articleList;}
}
5、获取session的几种方法的分析:
(1)this.getsession实际上是调用了父类中的方法获得session。使用spring管理hibernate的SessionFactory的时候,这个方法会从session池中拿出一个session。这样做有可能有问题,就是超session池连接数的时候,spring无法自动的关闭session。 不推荐使用。
(2)this.getHibernateTemplate().getSessionFactory().OpenSession。这种方法从spring管理的sessionFactory中创建一个session,此session不是线程绑定的。这种方法不用手动管理事务,但是同一个线程多次的开启和关闭session,浪费系统资源和影响执行效率,正常情况下还是不要用了。(需要手动关闭连接)
(3)this.getHibernateTemplate().getSessionFactory().getCurrentSession()。从spring管理的sessionFactory中创建一个绑定线程的session.,spring会根据该线程的执行情况来自动判断是关闭session还是延迟关闭。这样做可以避免手动的管理事务,同时一个线程最多开启和关闭一次session又可以提高程序的性能。 极力推荐使用这种方法。(可以完美解决本博客的问题)
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
