C3P0的介绍与使用



官方参考文档:https://www.mchange.com/projects/c3p0/

c3p0xml文件配置文档:https://www.mchange.com/projects/c3p0/#configuration_files


c3p0是一个易于使用的库,通过使用jdbc3规范定义的功能和jdbc2的可选扩展来增强传统JDBC驱动程序的“企业级”。从版本0.9.5开始,c3p0完全支持jdbc4规范。


特别是,c3p0提供了几种有用的服务:

一个类将传统的基于DriverManager的JDBC驱动程序适配到较新的javax.sql.DataSource方案以获取数据库连接。
DataSources背后的Connection和PreparedStatements透明池,可以“围绕”传统驱动程序或任意unpooled数据源。
图书馆努力获得正确的细节:

c3p0 DataSources既是可引用的也是可序列化的,因此适用于绑定到各种基于JNDI的命名服务。
当检入池中的连接和语句时,语句和结果集会被仔细清理,以防止当客户端使用懒惰但通用的资源管理策略清理其连接时资源耗尽。 (不要调皮。)
该库采用由JDBC 2和3规范定义的方法(即使这些方法与库作者的偏好相冲突)。 DataSources以JavaBean风格编写,提供所有必需的和大部分可选属性(以及一些非标准属性)以及无参数构造函数。所有JDBC定义的内部接口都已实现(ConnectionPoolDataSource,PooledConnection,ConnectionEvent生成连接等)。您可以将c3p0类与兼容的第三方实现混合使用(尽管并非所有c3p0功能都可以与ConnectionPoolDataSource的外部实现一起使用)。
c3p0希望能够提供更适合大批量“J2EE企业应用程序”使用的DataSource实现。请提供反馈,错误修复等!

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

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

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

【引用请注明出处http://blog.csdn.net/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_testproperty>  
  6.         <property name="checkoutTimeout">10000property>  
  7.         <property name="idleConnectionTestPeriod">10property>  
  8.         <property name="initialPoolSize">5property>  
  9.         <property name="maxIdleTime">600property>  
  10.         <property name="maxPoolSize">20property>  
  11.         <property name="minPoolSize">2property>  
  12.         <property name="maxStatements">60property>  
  13.         <property name="maxStatementsPerConnection">3property>  
  14.   
  15.         <user-overrides user="test-user">  
  16.             <property name="maxPoolSize">10property>  
  17.             <property name="minPoolSize">1property>  
  18.             <property name="maxStatements">0property>  
  19.         user-overrides>  
  20.   
  21.     default-config>  
  22.   
  23.     <named-config name="metkb">  
  24.         <property name="acquireIncrement">20property>  
  25.         <property name="initialPoolSize">10property>  
  26.         <property name="minPoolSize">10property>  
  27.         <property name="maxPoolSize">100property>  
  28.   
  29.         <property name="maxStatements">0property>  
  30.         <property name="maxStatementsPerConnection">10property>  
  31.   
  32.           
  33.         <user-overrides user="master-of-the-universe">  
  34.             <property name="acquireIncrement">1property>  
  35.             <property name="initialPoolSize">1property>  
  36.             <property name="minPoolSize">1property>  
  37.             <property name="maxPoolSize">5property>  
  38.             <property name="maxStatementsPerConnection">50property>  
  39.         user-overrides>  
  40.     named-config>  
  41. c3p0-config>  
放在eclipse Web工程的src目录下即可(eclipse会将该目录下的配置文件复制到tomcat的webapps/XXX/WEB-INF/classes下)

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

【引用请注明出处http://blog.csdn.net/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.     }  
  110. }  


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


你可能感兴趣的:(JavaWeb开发,数据库连接,c3p0连接池,java)