一、连接池简介

 

Tomcat服务器可以事先准备数个、几十个预备连接对象,存放在称作连接池的容器当中,当用户需要与数据库打交道时,只需要从连接池中取出一个连接对象即可,用完之后得把连接对象返还给连接池。连接池中已经没有对象,而用户又想与数据库打交道,那么只有等待,直到连接池有了连接对象。

 

二、连接对象悄然耗尽?

   

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

 

三、罪魁祸首是Java代码

 

try-catch语句:




1. try
2. {

3. 
4. }
5. catch(Exception e)
6. {

7. 
8. }
9. finally
10. {

11.     db.close();
12. }

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


1. try
2. {

3.     rs = db.executeQuery(String sql);
4. while
5.     {

6. 
7.     }
8.     rs = db.executeQuery(String sql2);
9. while
10.     {

11. 
12.     }
13. }
14. catch (SQLException e)
15. {

16. 
17. }
18. finally
19. {

20.     db.close();
21. }

1块,下午借5块,我第二天可以还他6块钱,没有问题,但是你不还,问题就相当比较大了。按理说,最终的db.close()应该能够同时关闭两个rs对象,实际上却无法实现这样的操作,这也是为什么连接对象会悄然耗尽的缘由,还是那么一句,用完就放回。把上一组代码稍微修改,就能解决连接对象耗尽的问题。

 

1. try
2. {

3.     rs = db.executeQuery(String sql);
4. while
5.     {

6. 
7.     }
8.     db.close();
9.     rs = db.executeQuery(String sql2);
10. while
11.     {

12. 
13.     }
14. //db.close(); or wait for finally  
15. }
16. catch
17. {

18. 
19. }
20. finally
21. {

22.     db.close();
23. }

try-catch语句,而且它对连接对象是比较致命的:



1. try
2. {

3.     ResultSet rs_1, rs_2;
4.     Rs_1 = db.executeQuery(String sql);
5. while
6.     {

7.         rs_2 = db.executeQuery(String sql2);
8. do
9.         {

10. 
11. while
12.         db.close();
13.     }
14. //db.close(); or wait for finally  
15. }
16. catch (SQLException e)
17. {

18. 
19. }
20. finally
21. {

22.     db.close();
23. }


db对象,最后分别关闭它,就能够解决问题了。

四、结语点题

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