使用ajax进行分页查询因连接池耗尽导致请求被挂起(备忘)

原创 2013年12月10日 22:34:36

本人在项目中,实现分页查询时,遇到了这个问题,当多次翻页后,页面请求被挂起。项目使用spring MVC+hibernate。刷新页面没有反应,从新登陆同意不起作用,只有重启tomcat才能解决。经过1个多小时的调试,也没能找到问题所在,但发现了一个规律,就是每次出现页面卡死(即请求被挂起)都是在进行了固定次数(5)的翻页以后。由于程序未报任何异常,一直头疼中,但是突然想到了连接池,因为我的连接池最多连接数为10。想到了这里,感觉似乎抓到了问题的关键所在。然后百度了一下,果然就是这个原因。

问题代码如下:

protected <T> List<T> queryByPage(String sql,int page,int pageSize){
		Session session = getSession();
		Query query = session.createQuery(sql);
		//(page-1)*pageSize:将页码转化为实际数据库查询起始位置
		query.setFirstResult((page-1)*pageSize);
		query.setMaxResults(pageSize);
		List<T> list = query.list();
		return list;
	}
	
	protected String count(String sql){
		Session session = getSession();
		Query query = session.createQuery(sql);
		String count = query.list().get(0).toString();
		return count;
	}

这里没有对session进行关闭和释放,因为我的代码每次都要获取分页数据和总数,所以刚好5次以后,连接池被耗尽。在return 语句前面加上releaseSession(session);问题解决。

另外还有一种方式可以解决该问题:为查询方法也使用事务(这里我使用的是注解方式:在方法前面加上@Transactional(propagation=Propagation.NEVER)),使用事务后spring就会为当前线程绑定session,在执行完本次请求之后,spring会自动释放session。代码应该修改为这样:

protected <T> List<T> queryByPage(String sql,int page,int pageSize){
//		Session session = getSession();
		Session session = getSessionFactory().getCurrentSession();
		Query query = session.createQuery(sql);
		//(page-1)*pageSize:将页码转化为实际数据库查询起始位置
		query.setFirstResult((page-1)*pageSize);
		query.setMaxResults(pageSize);
		List<T> list = query.list();
//		releaseSession(session);
		return list;
	}
这里的session采用getSessionFactory().getCurrentSession();获得。问题得到解决。


Ajax异步请求阻塞情况的解决办法

现象:在一个网站中,当访问一个处理比较耗时的页面(A页面),页面请求还没有返回时,此时再点击访问该网站的其他页面(B页面)会出现B页面很久都没有响应和返回,直到A页面输出返回数据时才开始处理B页面的请...

ajax加载时会导致dom操作被挂起

chrome,IE8,ie9中同步(sync)方式的ajax导致dom更新滞后解决 有需要的朋友可参考一下。 当使用sync方式的ajax加载时会导致dom操作被挂起,有此问题的浏览器有chro...

Hibernate分页查询频繁操作出现数据库连接池不释放

就我所知,SSH框架配置的开源数据库连接池有4种,分别是DBCP、C3P0、Proxool、BoneCP。工作中最先接触使用的是DBCP,之后又使用了C3P0。最近在使用hibernate分页功能时,...

(备忘)Eclipse下配置tomcat连接池连接mysql数据库

过段时间可能会用到,今天稍微研究了一下,留在这里备忘. Eclipse用了Eclipse Java EE IDE for Web Developers.版本.http://www.eclipse.o...

Tomcat线程挂起与DBCP数据库连接池的配置优化

最近网站会出现一个现象是,在并发量大的时候,Tomcat或JBoss的服务线程会线程挂起,同时服务器容易出现数据连接的 java.net.SocketException: Broken pipe  的...

优化使用ROWNUM进行分页查询的SQL

使用ROWNUM进行web页面分页查询的SQL写法,需要使用性能好的语法,性能差别非常大!...

Apache Cassandra (四):使用php-cassandra进行分页查询,

1、使用 prepare 函数,设置 page_size=5 成功查询5条记录 , $cql ="select * from revall_books where solr_query = 'c...
  • iong_l
  • iong_l
  • 2017年06月21日 11:08
  • 462

采用JDBC进行数据库分页查询

  • 2008年12月14日 00:41
  • 22KB
  • 下载

Elasticsearch使用scroll进行分页查询

之前一直使用from size进行分页查询(深度分页),当数据量大的时候,对全部数据进行遍历,使用from size性能会很差,然后了解了下scroll方法,简单讲解一下scroll方法的使用。 从网...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用ajax进行分页查询因连接池耗尽导致请求被挂起(备忘)
举报原因:
原因补充:

(最多只允许输入30个字)