標籤:style blog http color os java 使用 io strong
複習資料庫連接池 : C3P0、DBCP
1、資料庫連接池技術的優點:
•資源重用: 由於資料庫連接得以重用,避免了頻繁建立,釋放串連引起的大量效能開銷。在減少系統消耗的基礎上,另一方面也增加了系統運行環境的平穩性。•更快的系統反應速度: 資料庫連接池在初始化過程中,往往已經建立了若干資料庫連接置於串連池中備用。此時串連的初始化工作均已完成。對於業務請求處理而言,直接利用現有可用串連,避免了資料庫連接初始化和釋放過程的時間開銷,從而減少了系統的回應時間。•新的資源分派手段: 對於多應用共用同一資料庫的系統而言,可在應用程式層通過資料庫連接池的配置,實現某一應用最大可用資料庫連接數的限制,避免某一應用獨佔所有的資料庫資源。•統一的串連管理,避免資料庫連接泄露: 在較為完善的資料庫連接池實現中,可根據預先的佔用逾時設定,強制回收被佔用串連,從而避免了常規資料庫連接操作中可能出現的資源流失。
1)兩種開源的資料庫連接池:• JDBC 的資料庫連接池使用 javax.sql.DataSource 來表示,DataSource 只是一個介面, 該介面通常由伺服器(Weblogic, WebSphere, Tomcat)提供實現,也有一些開源組織提供實現: –DBCP 資料庫連接池 –C3P0 資料庫連接池• DataSource 通常被稱為資料來源,它包含串連池和串連池管理兩個部分,習慣上也經常把 DataSource 稱為串連池
A:DBCP 資料來源 :• DBCP 是 Apache 軟體基金組織下的開源串連池實現,該串連池依賴該組織下的另一個開源系統:Common-pool. 如需使用該串連池實現,應在系統中增加如下兩個 jar 檔案:–
Commons-dbcp.jar:串連池的實現。–
Commons-pool.jar:串連池實現的依賴庫。•
Tomcat 的串連池正是採用該串連池來實現的。該資料庫連接池既可以與應用伺服器整合使用,也可由應用程式獨立使用。DBCP 資料來源使用範例:• 資料來源和資料庫連接不同,資料來源無需建立多個,它是產生資料庫連接的工廠,因此整個應用只需要一個資料來源即可。• 當資料庫訪問結束後,程式還是像以前一樣關閉資料庫連接:conn.close(); 但上面的代碼並沒有關閉資料庫的物理串連,它僅僅把資料庫連接釋放,歸還給了資料庫連接池。
/** * 1. 載入 dbcp 的 properties 設定檔: 設定檔中的鍵需要來自 BasicDataSource * 的屬性. * 2. 調用 BasicDataSourceFactory 的 createDataSource 方法建立 DataSource * 執行個體 * 3. 從 DataSource 執行個體中擷取資料庫連接. */ @Test public void testDBCPWithDataSourceFactory() throws Exception{ Properties properties = new Properties(); InputStream inStream = JDBCTest.class.getClassLoader() .getResourceAsStream("dbcp.properties"); properties.load(inStream); DataSource dataSource = BasicDataSourceFactory.createDataSource(properties); System.out.println(dataSource.getConnection()); // BasicDataSource basicDataSource = // (BasicDataSource) dataSource;// // System.out.println(basicDataSource.getMaxWait()); } /** * 使用 DBCP 資料庫連接池 * 1. 加入 jar 包(2 個jar 包). 依賴於 Commons Pool * 2. 建立資料庫連接池 * 3. 為資料來源執行個體指定必須的屬性 * 4. 從資料來源中擷取資料庫連接 * @throws SQLException */ @Test public void testDBCP() throws SQLException{ final BasicDataSource dataSource = new BasicDataSource(); //2. 為資料來源執行個體指定必須的屬性 dataSource.setUsername("root"); dataSource.setPassword("1230"); dataSource.setUrl("jdbc:mysql:///atguigu"); dataSource.setDriverClassName("com.mysql.jdbc.Driver"); //3. 指定資料來源的一些可選的屬性. //1). 指定資料庫連接池中初始化串連數的個數 dataSource.setInitialSize(5); //2). 指定最大的串連數: 同一時刻可以同時向資料庫申請的串連數 dataSource.setMaxActive(5); //3). 指定小串連數: 在資料庫連接池中儲存的最少的空閑串連的數量 dataSource.setMinIdle(2); //4).等待資料庫連接池分配串連的最長時間. 單位為毫秒. 超出該時間將拋出異常. dataSource.setMaxWait(1000 * 5); //4. 從資料來源中擷取資料庫連接 Connection connection = dataSource.getConnection(); System.out.println(connection.getClass()); connection = dataSource.getConnection(); System.out.println(connection.getClass()); connection = dataSource.getConnection(); System.out.println(connection.getClass()); connection = dataSource.getConnection(); System.out.println(connection.getClass()); Connection connection2 = dataSource.getConnection(); System.out.println(">" + connection2.getClass()); new Thread(){ public void run() { Connection conn; try { conn = dataSource.getConnection(); System.out.println(conn.getClass()); } catch (SQLException e) { e.printStackTrace(); } }; }.start(); try { Thread.sleep(5500); } catch (InterruptedException e) { e.printStackTrace(); } connection2.close(); }
DBCP資料來源例子
username=rootpassword=1230driverClassName=com.mysql.jdbc.Driverurl=jdbc:mysql:///atguiguinitialSize=10maxActive=50minIdle=5maxWait=5000
dbcp.properties
B:C3P0 資料來源
/** * 1. 建立 c3p0-config.xml 檔案, * 參考說明文檔中 Appendix B: Configuation Files 的內容 * 2. 建立 ComboPooledDataSource 執行個體; * DataSource dataSource = * new ComboPooledDataSource("helloc3p0"); * 3. 從 DataSource 執行個體中擷取資料庫連接. */ @Test public void testC3poWithConfigFile() throws Exception{ DataSource dataSource = new ComboPooledDataSource("helloc3p0"); System.out.println(dataSource.getConnection()); ComboPooledDataSource comboPooledDataSource = (ComboPooledDataSource) dataSource; System.out.println(comboPooledDataSource.getMaxStatements()); } @Test public void testC3P0() throws Exception{ ComboPooledDataSource cpds = new ComboPooledDataSource(); cpds.setDriverClass( "com.mysql.jdbc.Driver" ); //loads the jdbc driver cpds.setJdbcUrl( "jdbc:mysql:///atguigu" ); cpds.setUser("root"); cpds.setPassword("1230"); System.out.println(cpds.getConnection()); }
c3p0資料來源例子
<?xml version="1.0" encoding="UTF-8"?><c3p0-config> <named-config name="helloc3p0"> <!-- 指定串連資料來源的基本屬性 --> <property name="user">root</property> <property name="password">1230</property> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql:///atguigu</property> <!-- 若資料庫中串連數不足時, 一次向資料庫伺服器申請多少個串連 --> <property name="acquireIncrement">5</property> <!-- 初始化資料庫連接池時串連的數量 --> <property name="initialPoolSize">5</property> <!-- 資料庫連接池中的最小的資料庫連接數 --> <property name="minPoolSize">5</property> <!-- 資料庫連接池中的最大的資料庫連接數 --> <property name="maxPoolSize">10</property> <!-- C3P0 資料庫連接池可以維護的 Statement 的個數 --> <property name="maxStatements">20</property> <!-- 每個串連同時可以使用的 Statement 對象的個數 --> <property name="maxStatementsPerConnection">5</property> </named-config> </c3p0-config>
c3p0-config.xml
(待續。。。)
java攻城獅之路--複習JDBC(資料庫連接池 : C3P0、DBCP)