先看官网给的范例:
import java.sql.*; import javax.naming.*; import javax.sql.DataSource; import com.mchange.v2.c3p0.DataSources; /** * This example shows how to acquire a c3p0 DataSource and * bind it to a JNDI name service. */ public final class JndiBindDataSource { // be sure to load your database driver class, either via // Class.forName() [as shown below] or externally (e.g. by // using -Djdbc.drivers when starting your JVM). static { try { Class.forName( "com.mysql.jdbc.Driver" ); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] argv) { try { // let a command line arg specify the name we will // bind our DataSource to. String jndiName = argv[0]; // acquire the DataSource using default pool params... // this is the only c3p0 specific code here DataSource unpooled = DataSources.unpooledDataSource("jdbc:mysql://127.0.0.1:3306/gpsdata", "root", "root"); DataSource pooled = DataSources.pooledDataSource( unpooled ); // Create an InitialContext, and bind the DataSource to it in // the usual way. // // We are using the no-arg version of InitialContext's constructor, // therefore, the jndi environment must be first set via a jndi.properties // file, System properties, or by some other means. InitialContext ctx = new InitialContext(); ctx.rebind( jndiName, pooled ); System.out.println("DataSource bound to nameservice under the name "" + jndiName + '"'); } catch (Exception e) { e.printStackTrace(); } } static void attemptClose(ResultSet o) { try { if (o != null) o.close();} catch (Exception e) { e.printStackTrace();} } static void attemptClose(Statement o) { try { if (o != null) o.close();} catch (Exception e) { e.printStackTrace();} } static void attemptClose(Connection o) { try { if (o != null) o.close();} catch (Exception e) { e.printStackTrace();} } private JndiBindDataSource() {} }
1.建立 com.mchange.v2.c3p0.ComboPooledDataSource
这是一个JavaBean,在使用前应设置它的jdbcURL、user、password和driverClass。其他参数参考configuration properties
- ComboPooledDataSource cpds = new ComboPooledDataSource(); cpds.setDriverClass( "org.postgresql.Driver" );
- cpds.setJdbcUrl( "jdbc:postgresql://localhost/testdb" ); cpds.setUser("swaldman");
- cpds.setPassword("test-password");
- // 下面的设置是可选的,c3p0可以在默认条件下工作,也可以设置其他条件
- cpds.setMinPoolSize(5);
- cpds.setAcquireIncrement(5);
- cpds.setMaxPoolSize(20);
也可以使用命名Configuration
- ComboPooledDataSource cpds = new ComboPooledDataSource("intergalactoApp");
2.使用工厂类com.mchange.v2.c3p0.DataSources
com.mchange.v2.c3p0.DataSources 可以按照传统的JDBC驱动建立一个无连接池的DataSource,然后转化为连接池的DataSource。
- DataSource ds_unpooled = DataSources.unpooledDataSource("jdbc:postgresql://localhost/testdb", "swaldman", "test-password");
- DataSource ds_pooled = DataSources.pooledDataSource( ds_unpooled );
- // 此时DataSource已经可以使用,但应该显示的设置driver Class
- Class.forName("org.postgresql.Driver");
如果想设置其中的参数,可以将参数放入一个Map中
- DataSource ds_unpooled = DataSources.unpooledDataSource("jdbc:postgresql://localhost/testdb", "swaldman", "test-password");
- Map overrides = new HashMap();
- overrides.put("maxStatements", "200"); overrides.put("maxPoolSize", new Integer(50));
- //建立一个包括默认值和设置值的PooledDataSource
- ds_pooled = DataSources.pooledDataSource( ds_unpooled, overrides );
如果使用命名的Configuration,可以如下
- ds_pooled = DataSources.pooledDataSource( ds_unpooled, "intergalactoAppConfig", overrides );
销毁DataSource有两种方式
DataSource.destroy()方式
- DataSource ds_pooled = null;
- try {
- DataSource ds_unpooled = DataSources.unpooledDataSource("jdbc:postgresql://localhost/testdb", "swaldman", "test-password");
- ds_pooled = DataSources.pooledDataSource( ds_unpooled );
- // 下面正常使用DataSource...
- }
- finally {
- DataSources.destroy( ds_pooled );
- }
另一种是PooledDataSource 接口提供的close() 方法
- static void cleanup(DataSource ds) throws SQLException {
- // 确定是否为c3p0的PooledDataSource
- if ( ds instanceof PooledDataSource) {
- PooledDataSource pds = (PooledDataSource) ds;
- pds.close();
- } else
- System.err.println("Not a c3p0 PooledDataSource!");
- }