一、连接池简介
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对象,最后分别关闭它,就能够解决问题了。
四、结语点题
还是用开篇的一句话结尾吧。当用户需要与数据库打交道时,只需要从连接池中取出一个连接对象即可,用完之后得把连接对象返还给连接池。