Java 之 數據庫連接池


一、數據庫連接池

  1、連接池概念

    連接池其實就是一個容器(集合),存放數據庫連接的容器。

    當系統初始化好后,容器被創建,容器中會申請一些連接對象,當用戶來訪問數據庫時,從容器中獲取連接對象,用戶訪問之后,會將連接對象歸還給容器

  2、連接池好處

    ① 節約資源(不必沒連接一次數據都去創建一個 Connection 對象)

    ② 用戶訪問高效(每次連接只需要從數據庫連接池中獲取連接即可,不用等待連接數據庫的漫長過程)

  3、實現

    (1)標准接口:DataSource  在 javax.sql 包下

        常用方法

獲取連接:getConnection()
歸還連接:Connection.close()。如果連接對象

       Connection 是從連接池中獲取的,那么調用 Connection.close() 方法,則不會再關閉連接了,而是歸還連接。

    (2)接口的實現,一般不需要我們去實現,有數據庫廠商來實現

      ① C3P0:數據庫連接池技術

      ② Druid:數據庫連接池技術,由阿里巴巴提供

 

二、C3P0 連接池

  1、C3P0 數據庫連接池技術實現步驟

1. 導入jar包 (兩個) c3p0-0.9.5.2.jar mchange-commons-java-0.2.12.jar (注意:因為是連接數據庫,不要忘記導入數據庫驅動 jar 包)
2. 定義配置文件:
     名稱:c3p0.properties 或 c3p0-config.xml(名字必須為這兩個中一個,因為會自動加載配置文件)
     路徑:直接將文件放置 src 目錄下即可。  
3. 創建核心對象  數據庫連接池對象 ComboPooledDataSource
4. 獲取連接:getConnection()

    代碼實現

 1 public static void main(String[] args) throws SQLException {  2         // 創建數據庫連接對象
 3         DataSource ds = new ComboPooledDataSource(); // 會自動去加載配置文件  4 
 5         //獲取連接對象
 6         Connection conn = ds.getConnection();  7 
 8         // 打印連接對象
 9  System.out.println(conn); 10         
11         // 歸還對象
12  conn.close(); 13  }

 

  2、導入的 jar 包

    

  3、配置文件

    c3p0-config.xml 配置文件

 1 <c3p0-config>
 2   <!-- 使用默認的配置讀取連接池對象 -->
 3   <default-config>
 4       <!-- 連接參數 -->
 5     <property name="driverClass">com.mysql.jdbc.Driver</property>
 6     <property name="jdbcUrl">jdbc:mysql://localhost:3306/bookstore</property>
 7     <property name="user">root</property>
 8     <property name="password">root</property>
 9     
10     <!-- 連接池參數 -->
11     <!--初始化連接的數量-->
12     <property name="initialPoolSize">5</property>
13     <!--最大的連接數量-->
14     <property name="maxPoolSize">10</property>
15     <!--超時時間-->
16     <property name="checkoutTimeout">3000</property>
17   </default-config>
18 
19   <!--通過指定的名字來獲取連接的數據庫-->
20   <named-config name="otherc3p0"> 
21     <!-- 連接參數 -->
22     <property name="driverClass">com.mysql.jdbc.Driver</property>
23     <property name="jdbcUrl">jdbc:mysql://localhost:3306/bookstore</property>
24     <property name="user">root</property>
25     <property name="password">root</property>
26     
27     <!-- 連接池參數 -->
28     <property name="initialPoolSize">5</property>
29     <property name="maxPoolSize">8</property>
30     <property name="checkoutTimeout">1000</property>
31   </named-config>
32 </c3p0-config>

 

    注意:在配置文件中可以連接多個不同的數據庫,用<name-config> 聲明即可,到時候使用 name 屬性來調用即可,如果沒有指定 name,那么調用默認的數據庫。

     Demo:

 1 public static void main(String[] args) throws SQLException {  2         // 創建數據庫連接對象  3         //DataSource ds = new ComboPooledDataSource(""); //連接默認的數據庫
 4         DataSource ds = new ComboPooledDataSource("otherc3p0"); //連接 name=otherc3p0數據庫  5 
 6         //2 獲取連接
 7         Connection conn = ds.getConnection();  8 
 9         Statement stmt = conn.createStatement(); 10 
11         // 3.歸還連接
12  conn.close(); 13 
14     }

 

三、Druid 連接池

  1、Druid 數據庫連接池技術實現步驟

1. 導入 jar 包druid-1.0.9.jar
2. 定義配置文件
       名稱:是properties 形式的,需要手動加載
       路徑:可以放在任意目錄下(建議放在src目錄下)
3. 加載配置文件 properties
4. 獲取數據連接池對象:通過工廠來獲取 DruidDataSourceFactory
5. 獲取連接:getConnection
6. 歸還連接:close()

    代碼實現

 1 public class DruidDemo1 {  2     public static void main(String[] args) throws Exception {  3         //1.導入jar包  4         //2.定義配置文件  5 
 6         //3.加載配置文件
 7         Properties prop = new Properties();  8         InputStream is = DruidDemo1.class.getClassLoader().getResourceAsStream("druid.properties");  9  prop.load(is); 10 
11         //4.獲取連接池對象
12         DataSource ds = DruidDataSourceFactory.createDataSource(prop); 13 
14 
15         //5.獲取連接
16         Connection conn = ds.getConnection(); 17  System.out.println(conn); 18         
19         // 6.歸還連接
20  conn.close(); 21  } 22 }

 

  2、導入 jar 包

      

  3、配置文件

    druid.properties 文件

 1 driverClassName=com.mysql.jdbc.Driver  2 url=jdbc:mysql://127.0.0.1:3306/bookstore
 3 username=root  4 password=root  5 # 初始化連接數量  6 initialSize=5
 7 # 最大連接數  8 maxActive=10
 9 # 延遲時間 10 maxWait=3000

 

  4、Druid 連接池的工具類

    可以將數據庫連接池封裝成一個工具類,這樣在獲取的連接的時候,直接拿來用即可,不用再創建連接池,更加方便。

 1 import com.alibaba.druid.pool.DruidDataSourceFactory;  2 
 3 import javax.sql.DataSource;  4 import java.io.IOException;  5 import java.sql.Connection;  6 import java.sql.ResultSet;  7 import java.sql.SQLException;  8 import java.sql.Statement;  9 import java.util.Properties; 10 
11 /**
12  * Druid 連接池的工具類 13  */
14 public class JDBCUtils { 15 
16     // 1.定義成員變量
17     private static DataSource ds; 18 
19     static { 20         //加載配置文件
21         Properties pro = new Properties(); 22         try { 23             pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties")); 24             // 2 獲取datasource
25             ds = DruidDataSourceFactory.createDataSource(pro); 26         } catch (IOException e) { 27  e.printStackTrace(); 28         } catch (Exception e) { 29  e.printStackTrace(); 30  } 31 
32  } 33 
34     /**
35  * 獲取連接 36      */
37     public static Connection getConnection() throws SQLException { 38         return ds.getConnection(); 39  } 40 
41     /**
42  * 釋放資源 43      */
44     public static void close(Statement stmt, Connection conn) { 45         if (stmt != null) { 46             try { 47  stmt.close(); 48             } catch (SQLException e) { 49  e.printStackTrace(); 50  } 51  } 52         if (conn != null) { 53             try { 54  stmt.close(); 55             } catch (SQLException e) { 56  e.printStackTrace(); 57  } 58  } 59  } 60 
61     public static void close(ResultSet rs, Statement stmt, Connection conn) { 62         if (rs != null) { 63             try { 64  rs.close(); 65             } catch (SQLException e) { 66  e.printStackTrace(); 67  } 68  } 69         if (stmt != null) { 70             try { 71  stmt.close(); 72             } catch (SQLException e) { 73  e.printStackTrace(); 74  } 75  } 76         if (conn != null) { 77             try { 78  conn.close(); 79             } catch (SQLException e) { 80  e.printStackTrace(); 81  } 82  } 83  } 84 
85     /**
86  * 獲取連接池方法 87      */
88     public static DataSource getDataSource() { 89         return ds; 90  } 91 }

 


免責聲明!

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



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