1、數據庫鏈接池 java
數據庫鏈接是一種關鍵的有限的昂貴的資源,這一點在多用戶的網頁應用程序中體現得尤其突出。對數據庫鏈接的管理能顯著影響到整個應用程序的伸縮性和健壯性,影響到程序的性能指標。數據庫鏈接池正是針對這個問題提出來的。數據庫鏈接池負責分配、管理和釋放數據庫鏈接,它容許應用程序重複使用一個現有的數據庫鏈接,而再不是從新創建一個;釋放空閒時間超過最大空閒時間的數據庫鏈接來避免由於沒有釋放數據庫鏈接而引發的數據庫鏈接遺漏。這項技術能明顯提升對數據庫操做的性能。sql
2、原理數據庫
鏈接池基本的思想是在系統初始化的時候,將數據庫鏈接做爲對象存儲在內存中,當用戶須要訪問數據庫時,並不是創建一個新的鏈接,而是從鏈接池中取出一個已創建的空閒鏈接對象。使用完畢後,用戶也並不是將鏈接關閉,而是將鏈接放回鏈接池中,以供下一個請求訪問使用。而鏈接的創建、斷開都由鏈接池自身來管理。同時,還能夠經過設置鏈接池的參數來控制鏈接池中的初始鏈接數、鏈接的上下限數以及每一個鏈接的最大使用次數、最大空閒時間等等。也能夠經過其自身的管理機制來監視數據庫鏈接的數量、使用狀況等。工具
3、C3P0數據源sqlserver
這裏主要介紹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.javaui
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.javaspa
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; } }