Tomcat连接池对象耗尽,孰之过?

原创 2008年09月30日 03:47:00

一、连接池简介<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

 与数据库建立连接是最耗时的操作之一,而且数据库都有最大连接数的限制。假设数据库为每个用户都建议一个连接,很明显是不切实际的。Tomcat服务器可以事先准备数个、几十个预备连接对象,存放在称作连接池的容器当中,当用户需要与数据库打交道时,只需要从连接池中取出一个连接对象即可,用完之后得把连接对象返还给连接池。连接池中已经没有对象,而用户又想与数据库打交道,那么只有等待,直到连接池有了连接对象。

 

二、连接对象悄然耗尽?

   

 随便拿起一本Java Web入门书籍,肯定都会有不同层度的介绍JDBC的基础知识。绝大部分书籍都会记载先加载某某驱动程序,其次和指定数据库建立连接,然后执行SQL语句,接着可能返与不返回结果集,最后关闭连接等等。没有任何问题,但是应用相同的章法,也就是使用连接池技术后,很多初学者将会遇到尴尬的问题,为何我的程序访问了几次以后,服务器就罢工了?最后不得已重启Tomcat,你可能会认为提高最大连接数,能在一定程度上缓解问题,但这可能只是治标的办法之一。连接对象是相当重要,连接对象耗尽更可怕,是谁扼杀了宝贵的连接对象?

 

三、罪魁祸首是Java代码

 

 我们先来看一组极具代表性的try-catch语句:

  1. try
  2. {
  3. }
  4. catch(Exception e)
  5. {
  6. }
  7. finally
  8. {
  9.     db.close();
  10. }

 这是Java与数据库打交道时必不可少的、死板的异常类语句,我们都会在try{}里头写有关核心语句,譬如实例化一个ResultSet对象即将对单条SQL语句进行查询,或者对某一数据表进行update,最终调用close()方法关闭连接对象。这是没有问题的,连接对象会乖乖的回到连接池当中。如果你打算同时对多条SQL语句进行操作时,可要小心了,我们先看一下一组try-catch语句:

  1. try
  2. {
  3.     rs = db.executeQuery(String sql);
  4.     while (rs.next())
  5.     {
  6.     }
  7.     rs = db.executeQuery(String sql2);
  8.     while (rs.next())
  9.     {
  10.     }
  11. }
  12. catch (SQLException e)
  13. {
  14. }
  15. finally
  16. {
  17.     db.close();
  18. }

 如果你如此写,感觉还是没有问题的话,那应该兴庆你的课程设计甚至毕业设计没有使用连接池技术。这里还是将要引用我开篇的连接池简介中这么一句:当用户需要与数据库打交道时,只需要从连接池中取出一个连接对象即可,用完之后得把连接对象返还给连接池。我打算跟好友借钱,上午借1块,下午借5块,我第二天可以还他6块钱,没有问题,但是你不还,问题就相当比较大了。按理说,最终的db.close()应该能够同时关闭两个rs对象,实际上却无法实现这样的操作,这也是为什么连接对象会悄然耗尽的缘由,还是那么一句,用完就放回。把上一组代码稍微修改,就能解决连接对象耗尽的问题。

 

  1. try
  2. {
  3.     rs = db.executeQuery(String sql);
  4.     while (rs.next())
  5.     {
  6.     }
  7.     db.close();
  8.     rs = db.executeQuery(String sql2);
  9.     while (rs.next())
  10.     {
  11.     }
  12.     //db.close(); or wait for finally 
  13. }
  14. catch (SQLException e)
  15. {
  16. }
  17. finally
  18. {
  19.     db.close();
  20. }

 你可能还会接触到以下一组try-catch语句,而且它对连接对象是比较致命的:

  1. try
  2. {
  3.     ResultSet rs_1, rs_2;
  4.     Rs_1 = db.executeQuery(String sql);
  5.     while (rs.next())
  6.     {
  7.         rs_2 = db.executeQuery(String sql2);
  8.         do
  9.         {
  10.         }while (rs_2.next())
  11.         db.close();
  12.     }
  13.     //db.close(); or wait for finally 
  14. }
  15. catch (SQLException e)
  16. {
  17. }
  18. finally
  19. {
  20.     db.close();
  21. }

 你认为这组代码是否会杀死连接对象的元凶呢?实际上,它比前面的代码更加霸道,你尽可能的缴费心肌甚至夸张的在每个角落里写上千行关闭连接的代码也无济于事。这时,我建议应该实例化两个db对象,最后分别关闭它,就能够解决问题了。

 

四、结语点题

   还是用开篇的一句话结尾吧。当用户需要与数据库打交道时,只需要从连接池中取出一个连接对象即可,用完之后得把连接对象返还给连接池。

详解web容器 - Jetty与Tomcat孰强孰弱

Jetty 基本架构 Jetty目前的是一个比较被看好的 Servlet 引擎,它的架构比较简单,也是一个可扩展性和非常灵活的应用服务器。它有一个基本数据模型,这个数据模型就是 Handler(处...
  • u013371163
  • u013371163
  • 2017年03月05日 17:34
  • 160

tomcat自带连接池dbcp配置以及优化说明

转自:http://www.totcms.com/html/201602-29/20160229114145.htm 一个网站每天大概有20万的访问量,使用的tomcat自带dbcp连接...
  • acoolper
  • acoolper
  • 2017年03月10日 10:43
  • 4133

数据库连接池之超时总结 .

大家都觉得使用连接池可以使连接更好的控制,于是乎简单的配置了一下连接池就行了,只要能连接到数据库就觉得什么都ok了.其实不然,如果不正确的配置一 下连接池,那将得不偿失!原因是:连接池的确会减少每次连...
  • keda8997110
  • keda8997110
  • 2012年12月17日 12:00
  • 4345

彻底解决 Jedis 连接池 获取不到连接,连接放回连接池错误的问题

Could not get jedis from the pool.
  • u010823097
  • u010823097
  • 2016年06月20日 14:27
  • 9085

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

本人在项目中,实现分页查询时,遇到了这个问题,当多次翻页后,页面请求被挂起。项目使用spring MVC+hibernate。刷新页面没有反应,从新登陆同意不起作用,只有重启tomcat才能解决。经过...
  • crazypandariy
  • crazypandariy
  • 2013年12月10日 22:34
  • 1402

Java连接池详解 tomcat

对于共享资源,有一个很著名的设计模式:资源池(Resource Pool)。该模式正是为了解决资源的频繁分配﹑释放所造成的问题。为解决我们的问题,可以采用数据库连接池技术。数据库连接池的基本思想就是为...
  • u011088260
  • u011088260
  • 2016年11月23日 20:36
  • 1922

Redis连接无法正常释放问题分析解决总结

Redis连接池无法正常释放连接,抛出异常:IllegalStateException: Invalidated object not currently part of this pool 线程不安...
  • li396864285
  • li396864285
  • 2016年11月23日 09:52
  • 14810

Tomcat中连接池的配置和使用

对于大型网站来说,信息查询的次数会非常多,每次查询都需要这样的过程:加载驱动程序、创建连接、创建语句对象、执行SQL语句、关闭这些对象。建立与数据库之间的连接和释放连接会占用很多系统的时间。如果能够让...
  • JavaEETeacher
  • JavaEETeacher
  • 2007年04月27日 13:19
  • 4723

tomcat7连接池使用

一直纠结于数据库连接池的实现,今天终于挤出时间来实现一下。tomcat之前连接池使用dbcp实现,dbcp有很多的缺点,现在的tomcat采用了自己实现的线程池,用起来还是非常的简单方面的。整体操作如...
  • dliyuedong
  • dliyuedong
  • 2014年04月10日 09:41
  • 11965

tomcat连接池的三个重要参数(用于处理连接池满的问题)

tomcat连接池的三个重要参数 tomcat连接池的三个重要参数,连接池的配置很重要,配置不好容易造成程序运行部稳定,下面把常见的问题归纳了下: a.   如果设为true则to...
  • nidayewocao
  • nidayewocao
  • 2011年11月04日 10:35
  • 1858
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Tomcat连接池对象耗尽,孰之过?
举报原因:
原因补充:

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