4、資料庫連線池的概念及C3P0、Uruid兩種連線池的使用

Frankmy發表於2020-11-25

目錄

1 為什麼要使用資料庫連線池

2 資料庫連線池的標準規範

3 C3P0 連線池的使用

4 Druid 連線池的使用


1 為什麼要使用資料庫連線池

JDBC使用時,會建立資料庫連線Connection物件,使用完畢後,再將這個物件銷燬掉,而每次建立和銷燬資料庫連線物件都是需要耗費時間的,因此需要優化資料庫的連線過程,提高效率。
優化思路:程式初始化的時候,初始化多個連線,將多個連線放入到池(集合)中,每次獲取的時候,直接從連線池中獲取連線物件,使用結束後,將連線歸還到池中

                                     

資料庫連線池思想如上圖所示:
(1)程式一開始就建立一定數量的連線,放在一個容器中,這個容器稱為連線池(相當於容器)。
(2)使用的時候直接從連線池中取一個已經建立好的連線物件。
(3)關閉的時候不是真正關閉連線,而是將連線物件再次放回到連線池中。 

2 資料庫連線池的標準規範

Java為資料庫連線池提供了公共的介面:javax.sql.DataSource,各個廠商需要讓自己的連線池實現這個介面。這樣應用程式可以方便的切換不同廠商的連線池,而不必要修改大量程式碼。
常見的第三方連線池如下:
(1)DBCP(DataBase Connection Pool)資料庫連線池,是Apache上的一個Java連線池專案,也是Tomcat使用的連線池元件。dbcp沒有自動回收空閒連線的功能。
(2)C3P0是一個開源的JDBC連線池,它實現了資料來源和JNDI繫結,支援JDBC3規範和JDBC2的標準擴充套件。C3P0是非同步操作的,所以一些操作時間過長的JDBC通過其它的輔助執行緒完成。目前使用它的開源專案有Hibernate,Spring等。C3P0有自動回收空閒連線功能。
(3)阿里巴巴-德魯伊 Druid 連線池:Druid是阿里巴巴開源平臺上的一個專案,整個專案由資料庫連線池、外掛框架和SQL解析器組成。該專案主要是為了擴充套件JDBC的一些限制,可以讓程式設計師實現一些特殊的需求(效能好,常用)。

3 C3P0 連線池的使用

對開發人員來說,學習C3P0很簡單,就是從連線池中拿連線來使用而已。
使用步驟
step1:匯入jar包
step2:編寫C3P0所要求的配置檔案。連線資料庫的4大資訊是必須的(千萬別寫在原始碼中,而是寫在配置檔案中,讀取配置檔案也不是我們自己讀了,而是C3P0來讀,於是這就對配置檔案有了要求)
C3P0對於配置檔案的要求:
(1)檔名稱 c3p0-config.xml
(2)檔案放在src下
step3:建立出DataSource介面的實現類
 通過實現類的getConnection() 方法獲取資料庫連線物件,上述步驟的程式碼實現如下所示:

public class C3p0Utils {
    //3、建立出DataSource介面的實現類
    //之所以要把連線物件設定為類的靜態成員,是因為該類只要進入到記憶體,就會優先載入其靜態成員,於是就會建立介面DataSource的實現類的物件
    //該實現類的物件會自動的讀取配置檔案中的資訊,有了該物件,就可以用來獲取資料庫連線物件了
    private static DataSource dataSource =  new ComboPooledDataSource(); //這個介面的實現類是直接new出來的,該介面是由C3P0實現的

    //提供方法,通過DataSource的實現類物件獲取資料庫連線物件,呼叫該方法,就能獲取到資料庫連線物件
    public static Connection getConnection() throws SQLException {
        return dataSource.getConnection();
    }
}
public class TestC3p0 {
    public static void main(String[] args) throws SQLException {
        //測試C3P0連線池:通過工具類獲取資料庫連線物件
        Connection connection = C3p0Utils.getConnection();
        System.out.println(connection);

        //這裡是中間操作:建立sql執行物件、執行sql···

        //釋放資源:該資料庫連線物件不會被銷燬,而是又被放回到連線池中了
        connection.close();
    }
}

注意:C3P0連線池所用到的配置檔案是xml格式的,且要保證固定的檔名和存放路徑,不能出錯,如下圖所示:

<?xml version="1.0" encoding="utf-8" ?>
<!--配置資料庫連線的4大資訊-->
<c3p0-config>
    <!-- 使用預設的配置讀取連線池物件 -->
    <default-config>
        <!--  連線引數 -->
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://ip:port/databasename</property>
        <property name="user">my_username</property>
        <property name="password">my_password</property>
        <!-- 連線池引數(可以不加,有預設數值,該引數主要由運營人員進行維護) -->
        <property name="initialPoolSize">5</property>
    </default-config>
</c3p0-config>

 

4 Druid 連線池的使用

阿里巴巴 Druid 資料庫連線池
目的:從連線池中獲取資料庫連線物件
實現步驟:
step1:匯入jar包
step2:把資料庫連線4大資訊放到properties檔案中(名字隨意,儲存位置隨意)
step3:建立DataSource介面實現類物件,呼叫物件方法獲取資料庫連線物件,上述步驟的程式碼實現如下所示:

public class DruidUtils {
    private static DataSource dataSource;
    static {
        //自己讀取配置檔案,用類載入器
        InputStream inputStream = DruidUtils.class.getClassLoader().getResourceAsStream("druid.properties");
        //把流中的資料存到集合中
        Properties properties = new Properties();
        try {
            properties.load(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
        //建立DataSource介面實現類物件(通過工廠類獲取,而不是直接new一個物件出來)
        try {
            dataSource = DruidDataSourceFactory.createDataSource(properties);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //定義方法,獲取連線物件
    public static Connection getConnection() throws SQLException {
        return dataSource.getConnection();
    }
}
public class TestDruid {
    public static void main(String[] args) throws SQLException {
        Connection connection = DruidUtils.getConnection();
        //測試:是否獲取到資料庫連線物件
        System.out.println(connection);
        //釋放資源:把連線物件返還給連線池
        connection.close();
    }
}

注意:Druid連線池所用到的配置檔案是properties格式的,無所謂檔名與路徑,需要我們先自己讀取該配置檔案,然後把資料傳給Druid,具體操作見上面的程式碼,配置檔案內容如下(4個引數的key值是固定的,不能改名!如果改名了會報錯,請注意):

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://ip:port/databasename
username=my_username
password=my_password

 

相關文章