使用连接池管理连接

  • C3P0数据源
  • C3P0数据库连接池的基本使用
  • 导入jar包
  • 定义配置文件
  • 编写文件
  • 测试C3P0参数
  • 获得10个连接对象
  • 获取11个连接对象
  • 调用close()方法归还连接对象



数据库连接的建立及关闭是极耗费系统资源的操作,通过DriverManager获取的数据库连接,一个数据库连接对象均对应一个物理数据库连接,每次操作都打开一个物理连接,使用完后立即关闭连接。频繁地打开、关闭连接将造成系统性能低下。


数据库连接池的解决方案是:当应用程序启动的时候,系统主动建立足够的数据库连接,并将这些连接组成一个连接池。每次应用程序请求数据库连接时,无需重新打开连接,而是从连接池中取出已有的连接使用,使用完后不再关闭数据库连接,而是直接将连接归还给连接池。通过使用连接池,将大大提高程序的运行效率。


对于共享资源的情况,有一个通用的设计模式:资源池(Resource Pool),用于解决资源的频繁请求、释放所造成的性能下降。为了解决数据库连接的频繁请求、释放,JDCBC 2.0 规范引入了数据库连接池技术。数据库连接池是Connection对象的工厂。数据库连接池的常用参数如下。

  1. 数据库的初始连接数
  2. 连接池的最大连接数
  3. 连接池的最小连接数
  4. 连接池每次增加的容量

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);
        }
	}
}

JAVA连接自动数释放代码 java连接池满了如何释放_jdbc

获取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);
        }
	}
}

JAVA连接自动数释放代码 java连接池满了如何释放_jdbc_02


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();
            }
        }
	}
}

JAVA连接自动数释放代码 java连接池满了如何释放_数据库连接_03


可以发现i=5时,调用close()方法,将对象归还,到i=6的时候,重新使用。