【零碎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();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章