JavaWeb學習過程 之c3p0的使用


  這幾天在學習使用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的一些知識,今后在學習的過程中慢慢摸索,逐漸補充。

 

 

    

    

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM