使用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();获得。问题得到解决。


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

前端笔试面试题--2

1.  css的display:none和visibility:hidden区别 display:none使用后,元素的宽度,高度都会丢失,视为不存在不加载;           ...

Java经典面试题

摘自张孝祥itcast 从享受生活的角度上来说:“程序员并不是一种最好的职业,我认为两种人可以做程序员,第一,你不做程序员,你就没有什么工作可做,或者说是即使有可以做的工作但是你非常不愿意去做;...

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

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

ajax异步模式下实现等待loading(jQuery同步Ajax带来的UI线程阻塞问题及解决办法)

在与后台实现数据交互时经常会遇到一种这样的情况: 1.需要用一个ajax请求后台数据,并且要在获取到数据之后再渲染到页面,这个时候就必须用同步(async:false)。 2.然而在这个时候就会有另一...

关于HTML发送AJAX请求一直重复刷新页面问题

很多人用HTML模板做一些网页开发,并且需要用AJAX来跟后台做交互,但是用JS或者JQUERY设置好监听之后,点击会发现本页面又刷新了。 针对这个问题很多人都查了半天都查不到什么原因,语法什么都没...

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

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

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

1、使用 prepare 函数,设置 page_size=5 成功查询5条记录 , $cql ="select * from revall_books where solr_query = 'c...

Elasticsearch使用scroll进行分页查询

之前一直使用from size进行分页查询(深度分页),当数据量大的时候,对全部数据进行遍历,使用from size性能会很差,然后了解了下scroll方法,简单讲解一下scroll方法的使用。 从网...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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