1. 程式人生 > >Java個人總結——JDBC資料庫連線池(二)

Java個人總結——JDBC資料庫連線池(二)

三種常見的資料庫連線池


一、DBCP連線池

DBCP(DataBase connection pool),[資料庫連線池]。是 apache 上的一個 java 連線池專案,也是 tomcat 使用的連線池元件。單獨使用dbcp需要2個包:commons-dbcp.jar 和 commons-pool.jar由於建立資料庫連線是一個非常耗時的行為,所以通過連線池預先同資料庫建立一些連線,放在記憶體中,應用程式需要建立資料庫連線時直接到連線池中申請一個就行,用完後再放回去。

1 、DBCP連線池的使用

  • 1.1 建立專案
    建立JavaWeb專案

  • 1.2 匯入相應jar包

    mysql驅動包
    commons-dbcp.jar
    commons-pool.jar
    commons-logging.jar 日誌支援

  • 1.3 硬編碼使用DBCP

所謂的硬編碼方式就是在程式碼中新增配置

public class DbcpTest2 {

    @Test
    public void test() {
        //建立DBCP物件
        BasicDataSource bds = new BasicDataSource() ;
        //1.四個基本引數
        bds.setDriverClassName("com.mysql.jdbc.Driver"
); bds.setUrl("jdbc:mysql://localhost:3306/emp"); bds.setUsername("root"); bds.setPassword("root"); //2.其他引數 //初始大小 bds.setInitialSize(10); //最大空間 bds.setMaxTotal(50); //最大空閒 bds.setMaxIdle(15); //最小空閒 bds.setMinIdle(5); //最大等待時間
bds.setMaxWaitMillis(5000); try { for (int i = 0; i < 100; i++) { Connection conn = bds.getConnection(); System.out.println(conn + ".........." + i); conn.close();//沒有真的關閉,只是歸還給連線池 } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
  • 1.4 軟編碼使用DBCP

所謂的軟編碼,就是在專案中新增配置檔案,這樣就不需要每次程式碼中新增配合!

  1. 專案中新增配置

    檔名稱: dbcp.properties

    檔案位置: src下

#連線設定
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/school
username=root
password=root
#<!-- 初始化連線 -->
initialSize=10
#最大連線數量
maxTotal=50
#<!-- 最大空閒連線 -->
maxIdle=20
#<!-- 最小空閒連線 -->
minIdle=5
#<!-- 超時等待時間以毫秒為單位 6000毫秒/1000等於60秒 -->
maxWaitMillis=5000

程式碼實現

public class DbcpTest {

    @Test
    public void test() {
        //載入屬性檔案
        InputStream is = DbcpTest.class.getClassLoader().getResourceAsStream("dbcp.properties");
        Properties pro = new Properties();
        BasicDataSource bds = null ;
        try {
            pro.load(is);
            //使用工廠獲取資料庫連線池物件
            bds = BasicDataSourceFactory.createDataSource(pro) ;
            for (int i = 0; i < 100; i++) {
                Connection conn = bds.getConnection();
                System.out.println(conn + ".........." + i);
                conn.close();
            }

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

二、 C3P0連線池

C3P0是一個開源的JDBC連線池,它實現了資料來源和JNDI繫結,支援JDBC3規範和JDBC2的標準擴充套件。目前使用它的開源專案有Hibernate,Spring等。

c3p0與dbcp區別
 1.
    dbcp沒有自動回收空閒連線的功能
    c3p0有自動回收空閒連線功能
 2. 
    dbcp需要手動載入配置檔案
    c3p0自動載入

1、 使用步驟

  • 1.1 建立專案

  • 1.2 匯入jar包

    c3p0-0.9.1.2.jar
    mchange-commons-java-0.2.11.jar
    mysql驅動包

  • 1.3.新增配置檔案

    c3p0是在外部新增配置檔案,工具直接進行應用,因為直接引用,所以要求固定的命名和檔案位置

    檔案位置: src

    檔案命名:c3p0-config.xml 和 c3p0.properties

使用配置檔案:c3p0-config.xml

<!-- 該配置檔案為固定格式,需要時直接複製使用即可,無需記憶 -->
<c3p0-config>
    <!-- 預設配置,如果沒有指定則使用這個配置 -->
    <default-config>
        <!-- 基本配置 -->
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/school</property>
        <property name="user">root</property>
        <property name="password">root</property>
        <!--擴充套件配置-->
        <!-- 連線超過10秒報錯-->
        <property name="checkoutTimeout">10000</property>
        <!--30秒檢查空閒連線 -->
        <property name="idleConnectionTestPeriod">30</property>
        <!-- 初始大小 -->
        <property name="initialPoolSize">10</property>
        <!-- 每次增長的個數 -->
        <property name="acquireIncrement">5</property>
         <!-- 30秒不適用丟棄-->
        <property name="maxIdleTime">20</property>
        <property name="maxPoolSize">50</property>
        <property name="minPoolSize">5</property>
    </default-config> 
    <!-- 自己的配置,named-config name="自定義名稱" -->
    <!-- 程式呼叫時可以指定該自定義名稱,若不指定,系統自動呼叫上面的預設配置 -->
    <named-config name="my">
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/day2</property>
        <property name="user">root</property>
        <property name="password">111</property>
        <!-- 如果池中資料連線不夠時一次增長多少個 -->
        <property name="acquireIncrement">5</property>
        <property name="initialPoolSize">20</property>
        <property name="minPoolSize">10</property>
        <property name="maxPoolSize">40</property>
    </named-config>
</c3p0-config> 

使用屬性檔案:c3p0.properties

c3p0.driverClass=com.mysql.jdbc.Driver
c3p0.jdbcUrl=jdbc:mysql://localhost:3306/school
c3p0.user=root
c3p0.password=root
c3p0.acquireIncrement=5
c3p0.initialPoolSize=20
c3p0.minPoolSize=10
c3p0.maxPoolSize=40

注意:

  • c3p0的配置檔案內部可以包含命名配置檔案和預設配置檔案!預設是選擇預設配置!如果需要切換命名配置可以在建立c3p0連線池的時候填入命名即可!

  • 如果xml配置檔案和屬性檔案都存在時,xml優先順序高於屬性檔案

程式碼實現:

使用配置檔案配置資料庫連線池

public class C3p0Test2 {
    @Test
    public void test() {
        //使用配置檔案中的自定義配置,不寫引數自動呼叫預設配置
        ComboPooledDataSource cpds = new ComboPooledDataSource("my");
        try {
            //迴圈驗證是否成功
            for(int i=0; i<100; i++) {
                //從連線池中獲取連線
                Connection conn = cpds.getConnection() ;
                System.out.println(conn + "......" + i);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

同樣,我們還可以使用硬編碼的形式來配置C3P0

public class C3p0Test {
    @Test
    public void test() {
        ComboPooledDataSource cpds = new ComboPooledDataSource() ;
        try {
            //1.四個基本引數
            cpds.setDriverClass("com.mysql.jdbc.Driver");
            cpds.setJdbcUrl("jdbc:mysql://localhost:3306/emp");
            cpds.setUser("root");
            cpds.setPassword("lvyifan");
            //2.其他引數
            //2.1設定初始池大小
            cpds.setInitialPoolSize(10);
            //2.2設定最大池大小
            cpds.setMaxPoolSize(50);
            //2.3設定最小池大小
            cpds.setMinPoolSize(5);
            //2.4設定等待時間
            cpds.setCheckoutTimeout(5000);
            //2.5連線池一次擴充套件的大小
            cpds.setAcquireIncrement(5);
            for(int i=0; i<100; i++) {
                Connection conn = cpds.getConnection() ;
                System.out.println(conn + "....." + i);
                conn.close();
            }

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

由於此方法是程式碼顯得臃腫,且不易維護,所以我們一般使用配置檔案或屬性檔案的方式進行配置。


三、Druid連線池

Druid 是目前比較流行的高效能的,分散式列儲存的OLAP框架(具體來說是MOLAP)。它有如下幾個特點:
一、亞秒級查詢
druid提供了快速的聚合能力以及亞秒級的OLAP查詢能力,多租戶的設計,是面向使用者分析應用的理想方式。
二、實時資料注入
druid支援流資料的注入,並提供了資料的事件驅動,保證在實時和離線環境下事件的實效性和統一性
三、可擴充套件的PB級儲存
druid叢集可以很方便的擴容到PB的資料量,每秒百萬級別的資料注入。即便在加大資料規模的情況下,也能保證時其效性
四、多環境部署
druid既可以執行在商業的硬體上,也可以執行在雲上。它可以從多種資料系統中注入資料,包括hadoop,spark,kafka,storm和samza等
五、豐富的社群
druid擁有豐富的社群,供大家學習

使用步驟:

  • 1、匯入jar包
    druid-1.1.5.jar

  • 2、配置檔案 database.properties:

//連線設定
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/school
username=root
password=root
<!-- 初始化連線 -->
initialSize=10
//最大連線數量
maxActive=50
<!-- 最小空閒連線 -->
minIdle=5
<!-- 超時等待時間以毫秒為單位 6000毫秒/1000等於60秒 -->
maxWait=5000

實現程式碼:

public class DruitTest2 {
    @Test
    public void test() {
        // 使用類載入器載入屬性檔案
        InputStream is = DruitTest2.class.getClassLoader().getResourceAsStream("druid.properties") ;
        Properties pro = new Properties() ;
        try {
            pro.load(is);
            // 使用Druid連線池工廠例項化DruidDataSource介面
            DruidDataSource dds = (DruidDataSource) DruidDataSourceFactory.createDataSource(pro) ;
            for (int i = 0; i < 100; i++) {
                Connection conn = dds.getConnection() ;
                System.out.println(conn.getClass().getName() + "..." + i);
                conn.close() ;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}