C3P0学习集
使用
关于C3P0名字由来据说是星球大战中的C3P0号机器人
从用户的角度来看,c3p0只提供标准的jdbc数据源对象。在创建这些数据源时,用户可以控制池相关、命名相关和其他属性。一旦创建了数据源,所有池对用户都是完全透明的。
获取c3p0池支持数据源有三种方法:1)直接实例化并配置 ComboPooledDataSource;2)使用DataSources工厂类;3)通过直接实例化PoolBackedDataSource并设置其ConectionPoolDataSource来“构建自己的”池支持数据源。大多数用户可能会发现实例化combooleddatasource是最方便的方法。一旦实例化,c3p0数据源就可以绑定到几乎任何符合JNDI的名称服务。
不管您如何创建数据源,c3p0将对您未以编程方式指定的任何配置参数使用默认值。c3p0具有内置的硬编码默认值,但是您可以用配置文件覆盖这些默认值,这些文件作为顶级资源放在加载c3p0的jar文件的同一个类路径(或类加载器)中。
c3p0数据源可以通过简单的java.util.Properties属性名为c3p0.properties的文件,通过更高级的HOCON配置文件(例如。应用程序.conf, 应用程序.json),或XML格式的c3p0-配置.xml. 请参阅下面的配置。
实例化和配置ComboPooledDatasource转到顶部
也许创建c3p0池数据源的最直接的方法是实例化com.mchange.v2.c3p0.ComboPooledDataSource。这是一个JavaBean样式的类,具有公共的、无参数的构造函数,但是在使用数据源之前,必须确保至少设置jdbcUrl属性。您可能还需要设置用户和密码,并且,如果您使用的是一个不会在外部预加载的旧式JDBC驱动程序,则应该设置driverClass。
public static void main(String[] args) {
ComboPooledDataSource cpds = new ComboPooledDataSource();
cpds.setJdbcUrl( "jdbc:postgresql://localhost/testdb" );
cpds.setUser("swaldman");
cpds.setPassword("test-password"); // the settings below are optional -- c3p0 can work with defaults
cpds.setMinPoolSize(5);
cpds.setAcquireIncrement(5);
cpds.setMaxPoolSize(20); // The DataSource cpds is now a fully configured and usable pooled DataSource
}
任何c3p0数据源属性的默认值都由您提供的配置决定,否则将恢复为硬编码的默认值[请参阅配置属性]。c3p0支持命名配置,因此您可以配置多个数据源。如果希望使用命名配置,请构造com.mchange.v2.c3p0.ComboPooledDataSource,配置名称为构造函数:
ComboPooledDataSource cpds = new ComboPooledDataSource("intergalactoApp");
当然,您仍然可以通过编程方式重写上述任何属性。
使用DataSources工厂类
或者,您可以使用静态工厂类 [com.mchange.v2.c3p0.DataSources
]从传统的JDBC驱动程序构建非池化的DataSource,并从非池化的DataSource来构建池化的DataSource:
DataSource ds_unpooled = DataSources.unpooledDataSource("jdbc:postgresql://localhost/testdb",
"swaldman",
"test-password");
DataSource ds_pooled = DataSources.pooledDataSource( ds_unpooled );
如果使用DataSources工厂类,并且希望以编程方式重写默认配置参数,则可以提供重写属性的映射,在创造出pooleddatasource()时
查询池数据源的当前状态转到顶部
c3p0由池支持的数据源,其中包括combooleddatasource的实现和DataSources.pooledDataSource( … ),都实现了接口com.mchange.v2.c3p0.PooledDataSource,它提供了许多查询数据源连接池状态的方法。
清理c3p0池数据源后
在c3p0创建数据源之后,清理数据源的简单方法是使用类数据源定义的static destroy。只有池数据源需要清理,但是DataSources.destory( … ) 如果在非池化或非c3p0数据源上调用它,则不会造成任何损害。
另外,c3p0的PooledDataSource
接口包含一个close()
方法,当您知道使用完DataSource 后就
可以调用该方法。因此,您可以将c3p0派生的数据源强制
转换为PooledDataSource
并关闭它:
ComboPooledDataSource是PooledDataSource的一个实例,可以通过它的close()方法直接关闭。PooledDataSource实现java.lang.AutoCloseable(自动关闭),因此它们可以由java7+try with resources块来管理。
在其未被引用的客户端的垃圾收集()实例关闭之前,将其自身关闭。一如往常,定案应被视为一种后盾,而不是一种迅速或可靠的资源清理方法。