使用连接池管理连接
- C3P0数据源
- C3P0数据库连接池的基本使用
- 导入jar包
- 定义配置文件
- 编写文件
- 测试C3P0参数
- 获得10个连接对象
- 获取11个连接对象
- 调用close()方法归还连接对象
数据库连接的建立及关闭是极耗费系统资源的操作,通过DriverManager获取的数据库连接,一个数据库连接对象均对应一个物理数据库连接,每次操作都打开一个物理连接,使用完后立即关闭连接。频繁地打开、关闭连接将造成系统性能低下。
数据库连接池的解决方案是:当应用程序启动的时候,系统主动建立足够的数据库连接,并将这些连接组成一个连接池。每次应用程序请求数据库连接时,无需重新打开连接,而是从连接池中取出已有的连接使用,使用完后不再关闭数据库连接,而是直接将连接归还给连接池。通过使用连接池,将大大提高程序的运行效率。
对于共享资源的情况,有一个通用的设计模式:资源池(Resource Pool),用于解决资源的频繁请求、释放所造成的性能下降。为了解决数据库连接的频繁请求、释放,JDCBC 2.0 规范引入了数据库连接池技术。数据库连接池是Connection对象的工厂。数据库连接池的常用参数如下。
- 数据库的初始连接数
- 连接池的最大连接数
- 连接池的最小连接数
- 连接池每次增加的容量
JDBC的数据库连接池使用javax.sql.DataSource来表示,DataSource只是一个接口,该接口通常由商用服务器(如WebLogic、WebSphere)等提供实现,也有一些开源组织提供实现(如DBCP和C3P0).
DataSource通常被称为数据源,它包含连接池和连接池管理部分,但习惯上也经常把DataSource称为连接池。
C3P0数据源
C3P0连接池不仅可以自动清理不再使用的Connection,还可以自动清理Statement和ResultSet。C3P0连接池需要版本为1.3以上的JRE,推荐使用1.4以上的JRE。如果需要使用C3P0连接池,则应在系统中增加c3p0-0.9.1.2.jar包
下载地址:https://sourceforge.net/projects/c3p0/
C3P0数据库连接池的基本使用
导入jar包
c3p0-0.9.5.2.jar
mchange-commons-java-0.2.11.jar
定义配置文件
将c3p0-config.xml放到classpath路径下(即src文件夹)
<?xml version="1.0" encoding="utf-8"?>
<c3p0-config>
<default-config>
<property name="driverClass">oracle.jdbc.OracleDriver</property>
<property name="jdbcUrl">jdbc:oracle:thin:@localhost:1521:orcl</property>
<property name="user">scott</property>
<property name="password">tiger</property>
<!--初始连接数-->
<property name="initialPoolSize">5</property>
<!--最大连接数-->
<property name="maxPoolSize">10</property>
<!--超时时间-->
<property name="checkoutTimeout">3000</property>
</default-config>
<named-config name="otherc3p0">
<property name="driverClass">oracle.jdbc.OracleDriver</property>
<property name="jdbcUrl">jdbc:oracle:thin:@localhost:1521:orcl</property>
<property name="user">scott</property>
<property name="password">tiger</property>
<!--初始连接数-->
<property name="initialPoolSize">5</property>
<!--最大连接数-->
<property name="maxPoolSize">6</property>
<!--超时时间-->
<property name="checkoutTimeout">1000</property>
</named-config>
</c3p0-config>
编写文件
public class TestC3P0 {
public static void main(String[] args) throws SQLException {
//创建连接池实例
DataSource ds = new ComboPooledDataSource();
//获得数据库连接
Connection conn = ds.getConnection();
System.out.println(conn);
conn.close();
}
}
测试C3P0参数
获得10个连接对象
public class testC3P0 {
public static void main(String[] args) throws SQLException {
DataSource ds = new ComboPooledDataSource();
for(int i=1;i<=10;i++) {
Connection conn = ds.getConnection();
System.out.println(i + " " + conn);
}
}
}
获取11个连接对象
public class testC3P0 {
public static void main(String[] args) throws SQLException {
DataSource ds = new ComboPooledDataSource();
for(int i=1;i<=11;i++) {
Connection conn = ds.getConnection();
System.out.println(i + " " + conn);
}
}
}
Q:为什么出错了呢?
A:因为在c3p0-config.xml文件中配置的最大连接数为10
<!--最大连接数-->
<property name="maxPoolSize">10</property>
调用close()方法归还连接对象
public class testC3P0 {
public static void main(String[] args) throws SQLException {
DataSource ds = new ComboPooledDataSource();
for(int i=1;i<=10;i++) {
Connection conn = ds.getConnection();
System.out.println(i + " " + conn);
//当i=5时,调用一次close()方法
if(i==5) {
conn.close();
}
}
}
}
可以发现i=5时,调用close()方法,将对象归还,到i=6的时候,重新使用。