C3P0连接池使用小结

转自:http://blog.youkuaiyun.com/bhq2010/article/details/9219947


C3P0在最近的demo中也用了(我用的是0.9.2.1版本),因为单例很难应付大量并发。

【引用请注明出处http://blog.youkuaiyun.com/bhq2010/article/details/9219947

用法详见文档:http://www.mchange.com/projects/c3p0/

基本的用法在http://www.mchange.com/projects/c3p0/#quickstart,以及http://www.mchange.com/projects/c3p0/#using_c3p0中。

在项目中更为方便的做法是将配置写在配置文件中。

C0P0的配置文件名为c3p0-config.xml,详见http://www.mchange.com/projects/c3p0/#configuration_files

一个示例的配置文件如下:

【引用请注明出处http://blog.youkuaiyun.com/bhq2010/article/details/9219947

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.   
  3. <c3p0-config>  
  4.     <default-config>  
  5.         <property name="automaticTestTable">t_c3p0_test</property>  
  6.         <property name="checkoutTimeout">10000</property>  
  7.         <property name="idleConnectionTestPeriod">10</property>  
  8.         <property name="initialPoolSize">5</property>  
  9.         <property name="maxIdleTime">600</property>  
  10.         <property name="maxPoolSize">20</property>  
  11.         <property name="minPoolSize">2</property>  
  12.         <property name="maxStatements">60</property>  
  13.         <property name="maxStatementsPerConnection">3</property>  
  14.   
  15.         <user-overrides user="test-user">  
  16.             <property name="maxPoolSize">10</property>  
  17.             <property name="minPoolSize">1</property>  
  18.             <property name="maxStatements">0</property>  
  19.         </user-overrides>  
  20.   
  21.     </default-config>  
  22.   
  23.     <named-config name="metkb">  
  24.         <property name="acquireIncrement">20</property>  
  25.         <property name="initialPoolSize">10</property>  
  26.         <property name="minPoolSize">10</property>  
  27.         <property name="maxPoolSize">100</property>  
  28.   
  29.         <property name="maxStatements">0</property>  
  30.         <property name="maxStatementsPerConnection">10</property>  
  31.   
  32.         <!-- he's important, but there's only one of him -->  
  33.         <user-overrides user="master-of-the-universe">  
  34.             <property name="acquireIncrement">1</property>  
  35.             <property name="initialPoolSize">1</property>  
  36.             <property name="minPoolSize">1</property>  
  37.             <property name="maxPoolSize">5</property>  
  38.             <property name="maxStatementsPerConnection">50</property>  
  39.         </user-overrides>  
  40.     </named-config>  
  41. </c3p0-config>  
放在eclipse Web工程的src目录下即可(eclipse会将该目录下的配置文件复制到tomcat的webapps/XXX/WEB-INF/classes下)

一个C3P0的单例的示例代码如下(连接池的单例并不妨碍并发,因为从连接池中取连接并不费时,而且取出的连接是线程安全的):

【引用请注明出处http://blog.youkuaiyun.com/bhq2010/article/details/9219947

  1. package cn.edu.ruc.metkb.util;  
  2.   
  3. import java.beans.PropertyVetoException;  
  4. import java.sql.Connection;  
  5. import java.sql.ResultSet;  
  6. import java.sql.SQLException;  
  7. import java.sql.Statement;  
  8.   
  9. import com.mchange.v2.c3p0.ComboPooledDataSource;  
  10.   
  11. public class PooledDBA implements DBA  
  12. {  
  13.     private ComboPooledDataSource cpds = null;  
  14.     private static Log dblog = null;  
  15.     private static String DBClassName = null;  
  16.     private static String DBName = null;  
  17.     private static String DBUrl = null;  
  18.     private static String DBUser = null;  
  19.     private static String DBPassword = null;  
  20.   
  21.     protected PooledDBA()  
  22.     {  
  23.         cpds = new ComboPooledDataSource("metkb");  
  24.         try  
  25.         {  
  26.             cpds.setDriverClass( DBClassName );  
  27.         }  
  28.         catch (PropertyVetoException e)  
  29.         {  
  30.             dblog.exception(e);  
  31.         }             
  32.         cpds.setJdbcUrl( DBUrl + DBName);  
  33.         cpds.setUser(DBUser);                                    
  34.         cpds.setPassword(DBPassword);  
  35.     }  
  36.   
  37.     static  
  38.     {  
  39.         try  
  40.         {  
  41.             DBClassName = ConfigFactory.getInstance().get("db.classname");  
  42.             DBName = ConfigFactory.getInstance().get("db.name");  
  43.             DBUrl = ConfigFactory.getInstance().get("db.url");  
  44.             DBUser = ConfigFactory.getInstance().get("db.user");  
  45.             DBPassword = ConfigFactory.getInstance().get("db.password");  
  46.             dblog = LogFactory.getInstance().getLog("db");  
  47.         }  
  48.         catch (Exception e)  
  49.         {  
  50.             e.printStackTrace();  
  51.         }  
  52.     }  
  53.   
  54.     @Override  
  55.     public synchronized Connection getConnection() throws SQLException, ClassNotFoundException, InterruptedException  
  56.     {  
  57.         return cpds.getConnection();  
  58.     }  
  59.   
  60.     @Override  
  61.     public synchronized void close(Connection conn)  
  62.     {  
  63.         try  
  64.         {  
  65.             if (conn != null)  
  66.             {  
  67.                 conn.close();  
  68.                 conn = null;  
  69.             }  
  70.         }  
  71.         catch (SQLException e)  
  72.         {  
  73.             dblog.exception(e);  
  74.         }  
  75.     }  
  76.       
  77.     @Override  
  78.     public synchronized void close(Statement stat)  
  79.     {  
  80.         try  
  81.         {  
  82.             if (stat != null)  
  83.             {  
  84.                 stat.close();  
  85.                 stat = null;  
  86.             }  
  87.         }  
  88.         catch (SQLException e)  
  89.         {  
  90.             dblog.exception(e);  
  91.         }  
  92.     }  
  93.       
  94.     @Override  
  95.     public synchronized void close(ResultSet rest)  
  96.     {  
  97.         try  
  98.         {  
  99.             if (rest != null)  
  100.             {  
  101.                 rest.close();  
  102.                 rest = null;  
  103.             }  
  104.         }  
  105.         catch (SQLException e)  
  106.         {  
  107.             dblog.exception(e);  
  108.         }  
  109.     }  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值