【零碎JAVA】数据库连接池

数据库连接池概念

我们都知道,在我们对数据库操作时,频繁打开关闭数据库资源,是一件十分耗时,耗资源的事情,数据库的打开与关闭会消耗很多的系统资源,因此,对程序的性能会有很大的影响。针对这个问题,提出了数据库连接池的概念,来有效的解决这个问题。数据库连接池其实就是对数据库连接资源(Connection)的管理,数据库连接池默认会主动创建一定数量的Connection对象,当有用户需要获取Connection对象时,数据库连接池将池内空闲的对象提供给用户操作,用户操作完成后调用Connection对象的close操作,此操作并不是将Connection对象销毁,关闭数据库连接,而是将Connection对象返还到数据库连接池,供下次其他用户请求,这样将连接对象持久化,就很好的解决了频繁打开关闭数据库资源的操作。

数据库连接池池参数

  • 初始大小:连接池默认生成多少个连接对象
  • 最小空闲连接数:当池中空闲连接数小于等于该值时,连接池对根据增量创建对应的连接对象
  • 增量:一次性创建连接对象的最小单位
  • 最大空闲连接数:当池中空闲连接数大于等于该值时,数据库自动销毁部分连接对象,直到空闲连接对象等于该值。
  • 最大连接个数:连接池创建连接对象,最多池中的连接对象总值不得超过该值
  • 最大等待时间:当池中没有空闲连接对象,且不得再创建连接对象时,用户再申请资源时的合理等待时间,超过该时间,抛出异常。

DBCP

dbcp是apache的common组件提供的数据库连接池(commons-dbcp-版本号.jar,此处用的是commons-dbcp-1.4.jar),这个jar包需要依赖commons-pools-版本号.jar,dbcp内部使用的是装饰者模式。
连接池必须实现javax.sql.DataSource接口!

  • 使用dbcp获取Connection对象

dbcp中的连接池对象为BasicDataSource

/*
         * 1.创建连接池对象
         * 2.配置四大参数
         * 3.配置池参数
         * 4.得到连接对象
         */
        BasicDataSource dataSource = new BasicDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/mydb");
        dataSource.setUsername("root");
        dataSource.setPassword("123456");

        dataSource.setMaxActive(10);//设置最大活动连接数
        dataSource.setMaxIdle(5);   //设置最大空闲连接
        dataSource.setMaxWait(1000);//设置最大等待时间,单位毫秒 

        Connection conn = dataSource.getConnection();

C3P0

C3P0是开源免费的数据库连接池,相对于DBCP,C3P0效率更高,更安全,运用更广泛被很多人看好。他需要依赖c3p0-0.9.2-pre1.jar与mchange-commons-0.2.jar,如果数据库使用的是Oracle,还需要依赖c3p0-oracle-thin-extras-0.9.2-pre1.jar
C3P0获取连接对象
C3P0中的连接池对象为ComboPooledDataSource

- 无配置文件方法

/*
         * 1.创建连接池对象
         * 2.配置四大参数
         * 3.设置池配置
         * 4.获取Connection对象
         */
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        dataSource.setDriverClass("com.mysql.jdbc.Driver");
        dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/mydb");
        dataSource.setUser("root");
        dataSource.setPassword("123456");   

        dataSource.setAcquireIncrement(5);
        dataSource.setInitialPoolSize(10);
        dataSource.setMaxPoolSize(20); 

        Connection conn = dataSource.getConnection();
        System.out.println(conn.getClass().getName());

        conn.close();

- 配置文件-默认
配置文件要求:
1.文件名必须是c3p0-config.xml
2.文件位置必须在src目录下
c3p0-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
    <default-config>
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/mydb</property>
        <property name="user">root</property>
        <property name="password">123456</property>
        <property name="acquireIncrement">5</property>
        <property name="InitialPoolSize">10</property>
        <property name="MAXPoolSize">20</property>
    </default-config>
</c3p0-config>

代码:

ComboPooledDataSource dataSource = new ComboPooledDataSource(); 

        Connection conn = dataSource.getConnection();
        System.out.println(conn.getClass().getName());

        conn.close();

- 配置文件-指定名字
c3p0-config.xml:

<named-config name="mysql-config">
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/mydb</property>
        <property name="user">root</property>
        <property name="password">123456</property>
        <property name="acquireIncrement">5</property>
        <property name="InitialPoolSize">10</property>
        <property name="MAXPoolSize">20</property>
    </named-config>

Java代码:

ComboPooledDataSource dataSource = new ComboPooledDataSource("mysql-config");
        Connection conn = dataSource.getConnection();
        System.out.println(conn.getClass().getName());

        conn.close();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章