方法一:
package C3P0;
import
java.sql.Connection;
import
java.sql.SQLException;
import
java.beans.PropertyVetoException;
import
com.mchange.v2.c3p0.ComboPooledDataSource;
public class DBPool{
private
static DBPool dbPool;
private
ComboPooledDataSource dataSource;
static {
dbPool=new
DBPool();
}
public
DBPool(){
try
{
dataSource=new
ComboPooledDataSource();
dataSource.setUser( "id ");
dataSource.setPassword( "pw ");
dataSource.setJdbcUrl(
"jdbc:mysql://127.0.0.1:3306/test?
autoReconnect=true&useUnicode=true&characterEncoding=GB2312
");
dataSource.setDriverClass( "com.mysql.jdbc.Driver
");
dataSource.setInitialPoolSize(2);
dataSource.setMinPoolSize(1);
dataSource.setMaxPoolSize(10);
dataSource.setMaxStatements(50);
dataSource.setMaxIdleTime(60);
}
catch (PropertyVetoException
e) {
throw new
RuntimeException(e);
}
}
public
final static DBPool
getInstance(){
return
dbPool;
}
public
final Connection
getConnection() {
try
{
return
dataSource.getConnection();
}
catch (SQLException
e) {
throw new
RuntimeException( "无法从数据源获取连接 ",e);
}
}
public
static void main(String[]
args) throws
SQLException
{
Connection con =
null;
try {
con =
DBPool.getInstance().getConnection();
} catch (Exception
e){
} finally
{
if (con !=
null)
con.close();
}
}
}
方法二:
原来不知道使用c3p0 是如此的简单,我一直使用properties
文件去配置c3p0,但总是连接不上数据库,后来调试才发现ComboPooledDataSource
这个对象的属性没有被设置成功,我是先获取了properties文件的内容,封装在一个 Properties对象里面,然后直接调用
ComboPooledDataSource 的 setProperties(Properties
p)
方法来配置c3p0,程序是没有报错,但连不上数据库,调试发现属性都没有设置成功,只是properties这个属性被设置了而已,结果我对每个属性调用set方法后就连接上了。。。
public final class ConnectionManager {
private static ConnectionManager instance;
public ComboPooledDataSource ds;
private static String c3p0Properties =
"c3p0.properties";
private ConnectionManager() throws Exception
{
Properties p = new
Properties();
p.load(this.getClass().getResourceAsStream(c3p0Properties));
ds = new
ComboPooledDataSource();
ds.setUser(p.getProperty("user"));
ds.setPassword(p.getProperty("user"));
ds.setJdbcUrl(p.getProperty("user"));
ds.setDriverClass(p.getProperty("user"));
ds.setInitialPoolSize(Integer.parseInt(p.getProperty("initialPoolSize")));
ds.setMinPoolSize(Integer.parseInt(p.getProperty("minPoolSize")));
ds.setMaxPoolSize(Integer.parseInt(p.getProperty("maxPoolSize")));
ds.setMaxStatements(Integer.parseInt(p.getProperty("maxStatements")));
ds.setMaxIdleTime(Integer.parseInt(p.getProperty("maxIdleTime")));
}
public static final ConnectionManager
getInstance() {
if (instance == null)
{
try
{
instance
= new ConnectionManager();
} catch
(Exception e) {
e.printStackTrace();
}
}
return instance;
}
public synchronized final Connection
getConnection() {
try {
return
ds.getConnection();
} catch (SQLException e)
{
e.printStackTrace();
}
return null;
}
protected void finalize() throws Throwable
{
DataSources.destroy(ds); //
关闭datasource
super.finalize();
}
}
如此就可以获取connection来做jdbc操作了:
Connection
conn=ConnectionManager.getInstance().getConnection();
记得使用完后调用close方法:
conn.close();
c3p0 的某些参数的配置以及意义见另外一篇文章http://kangzye.blog.163.com/blog/static/368192232010442162576/
|