JDBC:使用連接池管理連接

jopen 10年前發布 | 44K 次閱讀 JDBC Java開發

一、數據庫連接池       

         數據庫連接是一種關鍵的有限的昂貴的資源,這一點在多用戶的網頁應用程序中體現得尤為突出。對數據庫連接的管理能顯著影響到整個應用程序的伸縮性和健壯性,影響到程序的性能指標。數據庫連接池正是針對這個問題提出來的。數據庫連接池負責分配、管理和釋放數據庫連接,它允許應用程序重復使用一個現有的數據庫連接,而再不是重新建立一個;釋放空閑時間超過最大空閑時間的數據庫連接來避免因為沒有釋放數據庫連接而引起的數據庫連接遺漏。這項技術能明顯提高對數據庫操作的性能。

二、原理

        連接池基本的思想是在系統初始化的時候,將數據庫連接作為對象存儲在內存中,當用戶需要訪問數據庫時,并非建立一個新的連接,而是從連接池中取出一個已建立的空閑連接對象。使用完畢后,用戶也并非將連接關閉,而是將連接放回連接池中,以供下一個請求訪問使用。而連接的建立、斷開都由連接池自身來管理。同時,還可以通過設置連接池的參數來控制連接池中的初始連接數、連接的上下限數以及每個連接的最大使用次數、最大空閑時間等等。也可以通過其自身的管理機制來監視數據庫連接的數量、使用情況等。

三、C3P0數據源

        這里主要介紹C3P0開源數據庫連接池,它在lib目錄中與Hibernate一起發布,包括了實現jdbc3和jdbc2擴展規范說明的Connection 和Statement 池的DataSources 對象。

1.配置信息p3p0.propertise

#jdbc基本信息
driverClass = com.microsoft.sqlserver.jdbc.SQLServerDriver
jdbcUrl = jdbc:sqlserver://127.0.0.1:1435; DatabaseName = OMIMS
user = houxue
password = asd123

#c3p0連接池信息
c3p0.minPoolSize = 3
c3p0.maxPoolSize = 25
c3p0.initialPoolSize = 10
c3p0.maxStatement = 20

#當連接池中的連接耗盡的時候c3p0一次同時獲取的連接數
c3p0.acquireIncrement = 3
#定義在從數據庫獲取新連接失敗后重復嘗試的次數
c3p0.acquireRetryAttempts = 60
#兩次連接中間隔時間,單位毫秒
c3p0.acquireRetryDelay = 1000
#連接關閉時默認將所有未提交的操作回滾
c3p0.autoCommitOnClose = false
#當連接池用完時客戶端調用getConnection()后等待獲取新連接的時間,超時后將拋出SQLException,如設為0則無限期等待。單位毫秒
c3p0.checkoutTimeout = 3000
#每120秒檢查所有連接池中的空閑連接。Default: 0
c3p0.idleConnectionTestPeriod = 120
#最大空閑時間,60秒內未使用則連接被丟棄。若為0則永不丟棄。Default: 0
c3p0.maxIdleTime = 600
#如果設為true那么在取得連接的同時將校驗連接的有效性。Default: false
c3p0.testConnectionOnCheckin = true
#c3p0將建一張名為c3p0TestTable的空表,并使用其自帶的查詢語句進行測試。
jdbc.automaticTestTable = c3p0TestTable

2.配置數據庫連接信息ConfigUtil.java

package com.sdust.omims.db.utils;

import java.io.FileInputStream;
import java.util.Properties;

/**
 * 配置數據庫連接信息
 * 
 * @author Shmily
 * @version 1.0
 */
public class ConfigUtil {

    // 配置文件的所有信息
    private static Properties c3p0Pro = null;
    // 配置文件中關于C3P0的信息
    private static Properties c3propes = null;
    // 配置文件中關于JDBC的信息
    private static Properties jdbcpropes = null;

    // 初始化配置文件代碼塊
    static {
        initDBSource();
    }

    /**
     * 讀取配置文件
     */
    public static final void initDBSource() {
        c3p0Pro = new Properties();
        try {
            // 加載配置文件
            c3p0Pro.load(new FileInputStream("./properties/c3p0.properties"));
        } catch (Exception e) {
            e.printStackTrace();
        }

        jdbcpropes = new Properties();
        c3propes = new Properties();

        for (Object key : c3p0Pro.keySet()) {
            String skey = (String) key;
            if (skey.startsWith("c3p0.")) {
                c3propes.put(skey, c3p0Pro.getProperty(skey));
            } else {
                jdbcpropes.put(skey, c3p0Pro.getProperty(skey));
            }
        }

    }

    /**
     * 獲取配置文件的所有信息
     * 
     * @return c3p0Pro 配置文件的所有信息
     */
    public Properties getConfiguration() {
        return c3p0Pro;
    }

    /**
     * 獲取C3P0配置信息
     * 
     * @return c3propes C3P0配置信息
     */
    public Properties getC3P0Propes() {
        return c3propes;
    }

    /**
     * 獲取JDBC配置信息
     * 
     * @return jdbcpropes JDBC配置信息
     */
    public Properties getJDBCPropes() {
        return jdbcpropes;
    }

}

3.創建數據庫連接DBUtil.java

package com.sdust.omims.db.utils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;

import javax.sql.DataSource;

import com.mchange.v2.c3p0.DataSources;

/**
 * 數據庫工具類 封裝數據庫訪問的相關內容,并提供一組數據庫操作方法
 * 
 * @author Shmily
 */
public class DBUtil {

    private static final String JDBC_DRIVER = "driverClass";
    private static final String JDBC_URL = "jdbcUrl";

    // 數據庫連接配置信息
    ConfigUtil configUtil = null;
    Connection dbConnection = null;
    ResultSet dbResultSet = null;
    Statement dbStatement = null;

    boolean isConfigured = false;
    boolean isDriverLoaded = false;
    boolean isConnected = false;
    boolean isStatementCreated = false;

    /**
     * 加載數據庫驅動
     */
    public void loadDriver() {
        if (!isConfigured) {
            getConfiguration();
            isConfigured = true;
        }

        String driverClass = configUtil.getConfiguration().getProperty(
                JDBC_DRIVER);
        if (driverClass != null) {
            try {
                // 加載驅動類
                Class.forName(driverClass);
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }

        isDriverLoaded = true;
    }

    /**
     * 獲取C3P0配置信息
     */
    public void getConfiguration() {
        configUtil = new ConfigUtil();
    }

    /**
     * 獲取數據庫連接
     */
    public void getConnectioned() throws Exception {

        if (!isDriverLoaded) {
            loadDriver();
            isDriverLoaded = true;
        }

        DataSource ds = null;

        // 建立連接池
        DataSource unPooled = DataSources.unpooledDataSource(configUtil
                .getConfiguration().getProperty(JDBC_URL), configUtil
                .getJDBCPropes());
        ds = DataSources.pooledDataSource(unPooled, configUtil.getC3P0Propes());

        dbConnection = ds.getConnection();
        isConnected = true;
    }

}

 

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!