C3P0数据库连接池【JAVA】-oracle数据库为例

时间:2021-09-15 13:13:26

java项目中数据库的连接池选用了C3P0,个人感觉还是挺好用的,目前没有发现什么问题,主要是配置上的结合,今天总结一下如何使用及通用配置解析。

1.第三方jar 我使用的是 c3p0-0.9.2-pre4.jar

2. 刚开始使用这个的时候,由于项目比较紧张,我采用的是set方式来进行配置,其实后来一了解,繁琐了很多,当初的方式如下:

//数据库连接池 使用C3P0数据库连接池
private static ComboPooledDataSource _ds = new ComboPooledDataSource();

/**
* 数据库连接池初始化
*/
static {
try {
DbEntity db = ConfigCenter.GetDbEntity(); //DbEntity存储数据库连接中的各种信息
_ds.setJdbcUrl(db.get_url());
_ds.setUser(db.get_username());
_ds.setPassword(db.get_password());
_ds.setMaxStatements(0);
//TODO 连接池各种优化配置 按需添加
_ds.setDriverClass(db.get_driver());
} catch (PropertyVetoException e) {
...
}
}

/**
* 获取数据库连接
* @return
*/
private static Connection getConnection() {
Connection conn = null;
try {
conn = _ds.getConnection();
} catch (Exception e) {
...
}
return conn;
}
3. 上面这种配置连接池的方法是最繁琐的,之后我使用了配置文件配置,将配置文件c3p0-config.xml放在类加载路径下或自己定义的目录下,我个人喜欢将配置文件放入我指定的目录下,故我使用此种方式进行指定:

//加载c3p0连接池配置
System.setProperty("com.mchange.v2.c3p0.cfg.xml","configs/c3p0-config.xml");
4. 我之所以没有采用property文件,是因为我要用到多个数据库源,我的配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<named-config name="data1">
<property name="user">root</property>
<property name="password">root</property>
<property name="driverClass">oracle.jdbc.driver.OracleDriver</property>
<property name="jdbcUrl">jdbc:oracle:oci8:@dataname</property>
<!-- 连接池初始化时建立的连接数 默认值是3 -->
<property name="initialPoolSize">3</property>
<!-- 连接的最大空闲时间 单位秒 默认是0-代表永远不会断开连接 超过设定时间的空闲连接将会断开 -->
<property name="maxIdleTime">30</property>
<!-- 连接池中拥有的最大连接数 默认值为15个 -->
<property name="maxPoolSize">20</property>
<!-- 连接池中保持的最小连接数 默认值为3个-->
<property name="minPoolSize">3</property>
<!-- 将连接池的连接数保持在minpoolsize 必须小于maxIdleTime设置 默认值为0代表不处理 单位秒 -->
<property name="maxIdleTimeExcessConnections">15</property>
</named-config>
</c3p0-config>
XML配置文件 可以为多个数据源服务,提供default-config和named-config两种配置方式,如果你只用一个数据源,大可使用default-config配置,与named-config的却别是初始化的时候无参 or有参,default-config配置如下

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config>
<property name="user">root</property>
<property name="password">root</property>
<property name="driverClass">oracle.jdbc.driver.OracleDriver</property>
<property name="jdbcUrl">jdbc:oracle:oci8:@dataname</property>
<!-- 连接池初始化时建立的连接数 默认值是3 -->
<property name="initialPoolSize">3</property>
<!-- 连接的最大空闲时间 单位秒 默认是0-代表永远不会断开连接 超过设定时间的空闲连接将会断开 -->
<property name="maxIdleTime">30</property>
<!-- 连接池中拥有的最大连接数 默认值为15个 -->
<property name="maxPoolSize">20</property>
<!-- 连接池中保持的最小连接数 默认值为3个-->
<property name="minPoolSize">3</property>
<!-- 将连接池的连接数保持在minpoolsize 必须小于maxIdleTime设置 默认值为0代表不处理 单位秒 -->
<property name="maxIdleTimeExcessConnections">15</property>
</default-config>
</c3p0-config>

5.前序工作都做完了,现在该看看我们如何初始化了

//数据库连接池 使用C3P0数据库连接池 使用named-config模式 则通过有参构造函数初始化  带上name
private static ComboPooledDataSource _ds = new ComboPooledDataSource("data1");
//采用default-config模式 则使用无参构造函数即可
//private static ComboPooledDataSource _ds = new ComboPooledDataSource();

/**
* 获取数据库连接
* @return
*/
private static Connection getConnection() {
Connection conn = null;
try {
conn = _ds.getConnection();
} catch (Exception e) {
...
}
return conn;
}

   通过简单的配置即可实现多数据源的数据库连接池,在一个C3P0-config.xml配置文件中可以既有default-config 又有named-config,只是初始化的时候指明即可(无参 or 有参)

   突然想到,既然总结了oracle数据库连接池的初始化,下一次把对各种语句or存储过程or函数的执行调度也总结下吧,敬请期待...