相关文章推荐
谦和的番茄  ·  java stream filter ...·  9 月前    · 
风流倜傥的单杠  ·  PHP cURL: ...·  1 年前    · 
淡定的地瓜  ·  vue中使用tinymce ...·  1 年前    · 

问题描述:Hibernate使用时发现了一个问题,就是当请求超过20次的时候tomcat就会卡死,tomcat进程没有挂掉,堆内存也没用溢出,经检查是卡在查询这一块。

应用程序采用struts2 + spring2 + hibernate3架构
连接池配置使用的是c3p0,最大池大小为20, 很显然是连接池耗尽导致的。增加连接池大小只是饮鸩止渴,总还有耗尽的时候。

最开始Dao层代码

public class RiskMapDao  extends BaseDaoSupport{
	public Pager<RiskMapDto> getRatinglist(String riskname) {
		Pager<RiskMapDto> pager = new Pager<RiskMapDto>();
		Session session = getSession();
		try {
			StringBuffer hql = new StringBuffer("select t.province, t.city, t.county, t.riskname from map_data t where 1=1 ");    
			if(riskname != null && riskname != ""){
				hql.append(" and t.riskname ='" + riskname +"'");
			System.out.println("-------------"+hql+"-------------"); 		
			Query query =session.createSQLQuery(hql.toString()) ;
			pager.setList(query.list());
			session.close();
		} catch (HibernateException e) {
			e.printStackTrace();
		return pager;	

我尝试在获得list之后,使用getSession().close()关闭,依旧没有效果。查阅Spring API发现geSession()是 org.springframework.orm.hibernate3.support.HibernateDaoSupport 中的一个方法,它可以从当前事务或者一个新的事务获得一个hibernate session。我写的代码中数据库连接并没有被真正的关闭。

解决方案一:

在finally里面清空session,无论是否抛出异常,finally代码块总是会被执行。finally代码块主要用来释放资源。

public class RiskMapDao  extends BaseDaoSupport{
	public Pager<RiskMapDto> getRatinglist(String riskname) {
		Pager<RiskMapDto> pager = new Pager<RiskMapDto>();
		Session session = getSession();
		try {
			StringBuffer hql = new StringBuffer("select t.province, t.city, t.county, t.riskname from map_data t where 1=1 ");    
			if(riskname != null && riskname != ""){
				hql.append(" and t.riskname ='" + riskname +"'");
			System.out.println("-------------"+hql+"-------------"); 		
			Query query =session.createSQLQuery(hql.toString()) ;
			pager.setList(query.list());
		} catch (HibernateException e) {
			e.printStackTrace();
		}finally{
			session.close();
		return pager;	

解决方案二:

使用releaseSession(org.hibernate.Session)方法与getSession()配合,如果没有绑定线程,releaseSession关闭由这个DAO的SessionFactory创建的Hibernate Session。

public class RiskMapDao  extends BaseDaoSupport{
	public Pager<RiskMapDto> getRatinglist(String riskname) {
		Pager<RiskMapDto> pager = new Pager<RiskMapDto>();
		Session session = getSession();
		StringBuffer hql = new StringBuffer("select t.province, t.city, t.county, t.riskname from map_data t where 1=1 ");    
		if(riskname != null && riskname != ""){
			hql.append(" and t.riskname ='" + riskname +"'");
		System.out.println("-------------"+hql+"-------------"); 		
		Query query =session.createSQLQuery(hql.toString()) ;
		pager.setList(query.list());
		releaseSession(session);
		return pager;	
                    问题描述:Hibernate使用时发现了一个问题,就是当请求超过20次的时候tomcat就会卡死,tomcat进程没有挂掉,堆内存也没用溢出,经检查是卡在查询这一块。应用程序采用struts2 + spring2 + hibernate3架构连接池配置使用的是c3p0,最大池大小为20, 很显然是连接池耗尽导致的。增加连接池大小只是饮鸩止渴,总还有耗尽的时候。最开始Dao层代码public class RiskMapDao  extends BaseDaoSupport{	public Pa.
				
一、配置c3p0 1、导入 hibernate-c3po连接池包,Maven地址是:http://mvnrepository.com/artifact/org.hibernate/hibernate-c3p0/5.2.16.Final <dependency> <groupId>org.hibernate</...
找了半天终于找到了原因,是因为我的查询的时候直接获取了session,然后查的。但是这样spring事务没有提交,并不会释放session,所以查询8次后就无法再与数据库建立链接了。 有效的做法是:查询的时候使用  HibernateTemplate tmpl = getHibernateTemplate(); 代码如下:HibernateTemplate tmpl = getHibernateTemplate(); return (List) tmpl.execute(new Hiber
 当使用hibernate的getSession()方法获取session时,使用后是必需关闭的。如果不关闭会产生连接过多将会导致无法再访问到数据库或连接关闭,但在查询结束后立刻关闭session又会报错,网上很多文章说在web.xml中使用一个filter方法,但又有很多人说这样会产生很多问题。经研究,发现直接在session操作过程中进行捕捉,在最后finally中关闭,这样以上产生的问题就都解决了。解决办法:例子 public List getList(String hql) { List li
问题原因肯定和Hibernate有关,多半是配置文件的问题,检查下jdbc.properties里面的数据库连接配置,尤其注意下ip。 我报这个错是因为配置文件里面配置的ip出错了,我没有用localhost而是用的局域网ip,但是当时因为原ip被公司其它同事占用了,所以只能换一个,导致出现了这个问题。 将配置文件更改成本地ip后问题解决。
Criteria criteria = session.createCriteria(User.class); criteria.setFirstResult((pageNum - 1) * pageSize); criteria.setMaxResults(pageSize); List<User> userList = criteria.list(); 其中,pageNum 表示当前页码,pageSize 表示每页显示的记录数,User.class 是要查询的实体类。 使用 HQL 实现分页查询的示例代码如下: Query query = session.createQuery("from User"); query.setFirstResult((pageNum - 1) * pageSize); query.setMaxResults(pageSize); List<User> userList = query.list(); 同样,pageNum 和 pageSize 表示当前页码和每页显示的记录数,"from User" 表示要查询的实体类。 以上是 Hibernate 查询分页的两种实现方式,具体使用哪种方式取决于实际情况。