這幾天在學習使用MVC模式來做幾個小項目,在學習的過程中,用到了數據庫連接池。便特意去學習了一下。
一、談一談為什么要使用數據庫連接池
在開發基於數據庫的web程序時,傳統的模式(在servlet,beans 中建立數據庫鏈接,進行sql操作, 斷開數據庫鏈接) 存在着一些問題。
每次連接都需要驗證用戶,消耗了大量的資源和時間。數據庫的連接資源並沒有得到很好地重復利用。再如,同時幾萬人在線頻繁的連接數據庫,系統資源消耗巨大,內存可能泄漏,服務器也可能會崩潰。
二、什么是數據庫連接池
1.基本思想:可以為數據庫建立一個“緩沖池”。預先在緩沖池中放入一定數量的連接,當需要建立數據庫連接時,只需要從“緩沖池”中取出一個,使用完畢再放回去,避免了重復連接所消耗的時間與資源。
2.職責:數據庫連接池負責分配,管理,和釋放數據庫鏈接,它允許應用程序重復使用一個現有的數據庫鏈接,而不是新建立一個。
3.JDBC的數據庫鏈接池使用javax.sql.DataSource 來表示,DataSource 只是一個接口,該接口通常由服務器(Webblogic,Tomact)提供實現,也有一些開源組織提供實現:DBCP,C3P0。
三、使用C3P0 數據庫連接池
C3P0有兩種連接方式。
1.第一種:
具體步驟:
1.導入所需jar包
2.java代碼
1 import java.beans.PropertyVetoException; 2 import java.sql.Connection; 3 import java.sql.SQLException; 4 5 import com.mchange.v2.c3p0.ComboPooledDataSource; 6 7 8 public class JDBCUtils { 9 private static Connection conn=null; 10 private static ComboPooledDataSource comboPooledDataSource=new ComboPooledDataSource(); 11 12 public static Connection getConnection(){ 13 try { 14 comboPooledDataSource.setDriverClass("com.microsoft.sqlserver.jdbc.SQLServerDriver"); 15 comboPooledDataSource.setJdbcUrl("jdbc:sqlserver://localhost:1433;databasename=mysql"); 16 comboPooledDataSource.setUser("sa"); 17 comboPooledDataSource.setPassword("1546873"); 18 19 comboPooledDataSource.setAcquireIncrement(5);// 可以設置連接池的各種屬性 20 21 conn=comboPooledDataSource.getConnection(); 22 } catch (PropertyVetoException e) { 23 // TODO Auto-generated catch block 24 e.printStackTrace(); 25 } catch (SQLException e) { 26 // TODO Auto-generated catch block 27 e.printStackTrace(); 28 } 29 return conn; 30 } 31 32 }
2.第二種:
具體步驟:
1.導入jar包
2.配置xml文件。 配置文件名必須名為 c3p0-config.xml 並且放在src目錄下
代碼如下
1 <c3p0-config> 2 <named-config name="myc3p0"> 3 <property name="user">sa</property> 4 <property name="password">ztg591379771</property> 5 <property name="driverClass">com.microsoft.sqlserver.jdbc.SQLServerDriver</property> 6 <property name="jdbcUrl">jdbc:sqlserver://localhost:1433;databasename=mysql</property> 7 8 <!-- 若數據庫中連接數不足時,一次向數據庫服務器申請多少個鏈接 --> 9 <!--當連接池中的連接耗盡的時候c3p0一次同時獲取的連接數。Default: 3 --> 10 <property name="acquireIncrement">5</property> 11 12 13 <!--初始化時獲取三個連接,取值應在minPoolSize與maxPoolSize之間。Default: 3 --> 14 <property name="initialPoolSize">10</property> 15 16 17 <!--連接池中保留的最小連接數。--> 18 <property name="minPoolSize">10</property> 19 20 21 <!--連接池中保留的最大連接數。Default: 15 --> 22 <property name="maxPoolSize">50</property> <!-- intergalactoApp adopts a different approach to configuring statement caching --> 23 24 <!--JDBC的標准參數,用以控制數據源內加載的PreparedStatements數量。但由於預緩存的statements 25 屬於單個connection而不是整個連接池。所以設置這個參數需要考慮到多方面的因素。 26 如果maxStatements與maxStatementsPerConnection均為0,則緩存被關閉。Default: 0--> 27 <property name="maxStatements">20</property> 28 29 30 <!--maxStatementsPerConnection定義了連接池內單個連接所擁有的最大緩存statements數。Default: 0 --> 31 <!-- 每個鏈接可以使用的Statements 對象的個數 --> 32 <property name="maxStatementsPerConnection">5</property> <!-- he's important, but there's only one of him --> 33 34 </named-config> 35 </c3p0-config>
3.編寫utils工具類
1 import java.sql.Connection; 2 import java.sql.SQLException; 3 4 import com.mchange.v2.c3p0.ComboPooledDataSource; 5 6 public class JdbcUtils { 7 8 /** 9 * 釋放鏈接 10 * @param connection 11 */ 12 public static void releaseConnection(Connection connection){ 13 if(connection!=null){ 14 try { 15 connection.close(); 16 } catch (SQLException e) { 17 // TODO Auto-generated catch block 18 e.printStackTrace(); 19 } 20 } 21 } 22 23 24 private static ComboPooledDataSource dataSource=null; 25 26 static{ 27 //只被創建一次 28 dataSource=new ComboPooledDataSource("myc3p0"); // myc3p0 一定要與配置文件中的名字一樣 29 } 30 31 /** 32 * 返回數據源的一個Connection 對象 33 * @return 34 * @throws Exception 35 */ 36 public static Connection getConnection() throws Exception{ 37 return dataSource.getConnection(); 38 } 39 }
以上是我今天學到的關於c3p0的一些知識,今后在學習的過程中慢慢摸索,逐漸補充。