1. 程式人生 > >JDBC 之 資料庫連線池

JDBC 之 資料庫連線池

資料庫連線池

在使用開發基於資料庫的web程式時,傳統的模式基本是按以下步驟:  

在主程式(如servletbeans)中建立資料庫連線。

進行sql操作

斷開資料庫連線。

 

這種模式開發,存在的問題:

普通的JDBC資料庫連線使用 DriverManager 來獲取,每次向資料庫建立連線的時候都要將 Connection 載入到記憶體中,再驗證使用者名稱和密碼(得花費0.05s1s的時間)。需要資料庫連線的時候,就向資料庫要求一個,執行完成後再斷開連線。這樣的方式將會消耗大量的資源和時間。資料庫的連線資源並沒有得到很好的重複利用.若同時有幾百人甚至幾千人線上,頻繁的進行資料庫連線操作將佔用很多的系統資源,嚴重的甚至會造成伺服器的崩潰。

對於每一次資料庫連線,使用完後都得斷開。否則,如果程式出現異常而未能關閉,將會導致資料庫系統中的記憶體洩漏,最終將導致重啟資料庫。

這種開發不能控制被建立的連線物件數,系統資源會被毫無顧及的分配出去,如連線過多,也可能導致記憶體洩漏,伺服器崩潰。

 

資料庫連線池(connection pool

為解決傳統開發中的資料庫連線問題,可以採用資料庫連線池技術。

資料庫連線池的基本思想就是為資料庫連線建立一個“緩衝池”。預先在緩衝池中放入一定數量的連線,當需要建立資料庫連線時,只需從“緩衝池”中取出一個,使用完畢之後再放回去。

資料庫連線池負責分配、管理和釋放資料庫連線,它

允許應用程式重複使用一個現有的資料庫連線,而不是重新建立一個

資料庫連線池在初始化時將建立一定數量的資料庫連線放到連線池中,這些資料庫連線的數量是由最小資料庫連線數來設定的。無論這些資料庫連線是否被使用,連線池都將一直保證至少擁有這麼多的連線數量。連線池的最大資料庫連線數量限定了這個連線池能佔有的最大連線數,當應用程式向連線池請求的連線數超過最大連線數量時,這些請求將被加入到等待佇列中。

兩種開源的資料庫連線池 

JDBC 的資料庫連線池使用 javax.sql.DataSource 來表示,DataSource 只是一個介面,該介面通常由伺服器(Weblogic

, WebSphere, Tomcat)提供實現,也有一些開源組織提供實現:

DBCP 資料庫連線池

C3P0 資料庫連線池

DataSource 通常被稱為資料來源,它包含連線池和連線池管理兩個部分,習慣上也經常把 DataSource 稱為連線池

 

1.DBCP

要引入兩個jar包:

現寫一個配置檔案

username=scott
password=zq123456
driverClassName=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:orcl

initialSize=10
maxActive=50
minIdle=5
maxWait=5000
package com.jdbc.dbcp;

import org.apache.commons.dbcp.BasicDataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;

import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

public class DbcpTest {

    /**
     * 通過配置檔案設定資訊,來常見datasource;
     * @throws Exception
     */
    public void test2() throws Exception {
        Properties properties = new Properties();
        InputStream inStream = DbcpTest.class.getClassLoader()
                .getResourceAsStream("dbcp.properties");
        properties.load(inStream);

        DataSource dataSource =
                BasicDataSourceFactory.createDataSource(properties);
        Connection connection = dataSource.getConnection();
        System.out.println(connection);

//		BasicDataSource basicDataSource =
//				(BasicDataSource) dataSource;
//
//		System.out.println(basicDataSource.getMaxWait());
    }


    /**
     * 手動的建立datasource;
     * @throws SQLException
     */
    public void test() throws SQLException {
        //1.建立dbcp的資料來源例項;
        BasicDataSource dataSource=new BasicDataSource();

        //2.設定基本屬性;這裡寫死了,不好;
        dataSource.setUsername("scott");
        dataSource.setPassword("zq123456");
        dataSource.setUrl("jdbc:oracle:thin:@localhost:1521:orcl");
        dataSource.setDriverClassName("oracle.jdbc.driver.OracleDriver");

        //3.可選屬性:
        //指定資料庫連線池中初始化的連線數的個數;
        dataSource.setInitialSize(10);
        //指定最大的連線數:同一時刻可以同時向資料庫申請的連線數;
        dataSource.setMaxActive(50);
        //指定最小連線數:在資料庫連線池中儲存的最少的空閒連線的數量;
        dataSource.setMinIdle(5);
        //等在資料庫連線池分配連線的最長時間,單位毫秒,超時就會丟擲異常;
        dataSource.setMaxWait(1000*5);


        //4.獲取資料庫連線;
        Connection connection = dataSource.getConnection();

        System.out.println(connection.getClass());


    }
}

 

2.C3P0

先要搞兩個jar包;



    /**
     * 1. 建立 c3p0-config.xml 檔案,
     * 參考幫助文件中 Appendix B: Configuation Files 的內容
     * 2. 建立 ComboPooledDataSource 例項;
     * DataSource dataSource =
     *			new ComboPooledDataSource("helloc3p0");
     * 3. 從 DataSource 例項中獲取資料庫連線.
     */
    public void testC3poWithConfigFile() throws Exception{
        DataSource dataSource =
                new ComboPooledDataSource("helloc3p0");

        System.out.println(dataSource.getConnection());

        ComboPooledDataSource comboPooledDataSource =
                (ComboPooledDataSource) dataSource;
        System.out.println(comboPooledDataSource.getMaxStatements());
    }


    public void testC3P0() throws Exception{
        ComboPooledDataSource cpds = new ComboPooledDataSource();
        cpds.setDriverClass( "oracle.jdbc.driver.OracleDriver" ); //loads the jdbc driver
        cpds.setJdbcUrl( "jdbc:oracle:thin:@localhost:1521:orcl" );
        cpds.setUser("scott");
        cpds.setPassword("zq123456");

        System.out.println(cpds.getConnection());
    }