用apache的dbcp来建立数据库连接池

数据库连接池的好处是不言而喻的,现在大部分的application server都提供自己的数据库连接池方案,此时,只要按照application server的文档说明,正确配置,即可在应用中享受到数据库连接池的好处。 

       但是,有些时候,我们的应用是个独立的java application,并不是普通的WEB/J2EE应用,而且是单独运行的,不要什么application server的配合,这种情况下,我们就需要建立自己的数据库连接池方案了。这里,介绍如何利用apache的dbcp来建立为民自己的数据库连接池。 

1。首先,下载必须的jar包 
dbcp包,目前版本是1.2.1:http://jakarta.apache.org/commons/dbcp/ ],在附件已有 

pool包,目前版本是1.3:http://jakarta.apache.org/commons/pool/在附件已有 


       如果下载的pool包是1.2的版本,还要下载common-collections包:http://jakarta.apache.org/commons/collections/ 
在建立我们自己的数据库连接池时,可以使用xml文件来传入需要的参数,这里只使用hard code的方式来简单介绍,所有需要我们自己写的代码很少,只要建立一个文件如下: 

Java代码  收藏代码
  1. import org.apache.commons.dbcp.BasicDataSource;  
  2. import org.apache.commons.dbcp.BasicDataSourceFactory;  
  3.   
  4. import java.sql.SQLException;  
  5. import java.sql.Connection;  
  6. import java.util.Properties;  
  7.   
  8. public class ConnectionSource {  
  9.     private static BasicDataSource dataSource = null;  
  10.   
  11.     public ConnectionSource() {  
  12.     }  
  13.   
  14.     public static void init() {  
  15.   
  16.         if (dataSource != null) {  
  17.             try {  
  18.                 dataSource.close();  
  19.             } catch (Exception e) {  
  20.                 //  
  21.             }  
  22.             dataSource = null;  
  23.         }  
  24.   
  25.         try {  
  26.             Properties p = new Properties();  
  27.             p.setProperty("driverClassName""oracle.jdbc.driver.OracleDriver");  
  28.             p.setProperty("url""jdbc:oracle:thin:@192.168.0.1:1521:testDB");  
  29.             p.setProperty("password""scott");  
  30.             p.setProperty("username""tiger");  
  31.             p.setProperty("maxActive""30");  
  32.             p.setProperty("maxIdle""10");  
  33.             p.setProperty("maxWait""1000");  
  34.             p.setProperty("removeAbandoned""false");  
  35.             p.setProperty("removeAbandonedTimeout""120");  
  36.             p.setProperty("testOnBorrow""true");  
  37.             p.setProperty("logAbandoned""true");  
  38.   
  39.             dataSource = (BasicDataSource) BasicDataSourceFactory.createDataSource(p);  
  40.   
  41.         } catch (Exception e) {  
  42.             //  
  43.         }  
  44.     }  
  45.   
  46.   
  47.     public static synchronized Connection getConnection() throws  SQLException {  
  48.         if (dataSource == null) {  
  49.             init();  
  50.         }  
  51.         Connection conn = null;  
  52.         if (dataSource != null) {  
  53.             conn = dataSource.getConnection();  
  54.         }  
  55.         return conn;  
  56.     }  
  57. }  


       接下来,在我们的应用中,只要简单地使用ConnectionSource.getConnection()就可以取得连接池中的数据库连接,享受数据库连接带给我们的好处了。当我们使用完取得的数据库连接后,只要简单地使用connection.close()就可把此连接返回到连接池中,至于为什么不是直接关闭此连接,而是返回给连接池,这是因为dbcp使用委派模型来实现Connection接口了。 

      在使用Properties来创建BasicDataSource时,有很多参数可以设置,比较重要的还有: 

     testOnBorrow、testOnReturn、testWhileIdle,他们的意思是当是取得连接、返回连接或连接空闲时是否进行有效性验证(即是否还和数据库连通的),默认都为false。所以当数据库连接因为某种原因断掉后,再从连接池中取得的连接,实际上可能是无效的连接了,所以,为了确保取得的连接是有效的, 可以把把这些属性设为true。当进行校验时,需要另一个参数:validationQuery,对oracle来说,可以是:SELECT COUNT(*) FROM DUAL,实际上就是个简单的SQL语句,验证时,就是把这个SQL语句在数据库上跑一下而已,如果连接正常的,当然就有结果返回了。 

      还有2个参数:timeBetweenEvictionRunsMillis 和 minEvictableIdleTimeMillis, 他们两个配合,可以持续更新连接池中的连接对象,当timeBetweenEvictionRunsMillis 大于0时,每过timeBetweenEvictionRunsMillis 时间,就会启动一个线程,校验连接池中闲置时间超过minEvictableIdleTimeMillis的连接对象。 

 

 

http://www.iteye.com/topic/151132

posted @ 2014-02-08 12:05  hanks  阅读(446)  评论(0)    收藏  举报