數據庫連接池(設計模式)——數據庫


文章轉載自:https://blog.csdn.net/hu_belif/article/details/80812047

一、什么是數據庫連接池?

官方:數據庫連接池(Connection pooling)是程序啟動時建立足夠的數據庫連接,並將這些連接組成一個連接池,由程序動態地對池中的連接進行申請,使用,釋放。
個人理解:創建數據庫連接是一個很耗時的操作,也容易對數據庫造成安全隱患。所以,在程序初始化的時候,集中創建多個數據庫連接,並把他們集中管理,供程序使用,可以保證較快的數據庫讀寫速度,還更加安全可靠。

二、數據庫連接池的運行機制

(1)  程序初始化時創建連接池
(2) 使用時向連接池申請可用連接
(3) 使用完畢,將連接返還給連接池
(4) 程序退出時,斷開所有連接,並釋放資源

三、數據庫連接池的使用

作為開源的數據庫連接池,C3P0是一個優秀的連接池,性能也十分可靠。



首先到http://sourceforge.net/projects/c3p0/下載相應的jar包,總共三個,如下圖所示。
 
其次將jar包導入到工程當中,然后就可以使用cp30了。
示例代碼如下:
[java]  view plain  copy
 
 
 
 
 
  1. package com.zww.server;  
  2.   
  3. import java.beans.PropertyVetoException;  
  4. import java.sql.Connection;  
  5. import java.sql.SQLException;  
  6. import com.mchange.v2.c3p0.ComboPooledDataSource;  
  7.   
  8. public final class ConnectionManager {  
  9.     //使用單利模式創建數據庫連接池  
  10.     private static ConnectionManager instance;  
  11.     private static ComboPooledDataSource dataSource;  
  12.   
  13.     private ConnectionManager() throws SQLException, PropertyVetoException {  
  14.         dataSource = new ComboPooledDataSource();  
  15.   
  16.         dataSource.setUser("root");     //用戶名  
  17.         dataSource.setPassword("123456"); //密碼  
  18.         dataSource.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/zww");//數據庫地址  
  19.         dataSource.setDriverClass("com.mysql.jdbc.Driver");  
  20.         dataSource.setInitialPoolSize(5); //初始化連接數  
  21.         dataSource.setMinPoolSize(1);//最小連接數  
  22.         dataSource.setMaxPoolSize(10);//最大連接數  
  23.         dataSource.setMaxStatements(50);//最長等待時間  
  24.         dataSource.setMaxIdleTime(60);//最大空閑時間,單位毫秒  
  25.     }  
  26.   
  27.     public static final ConnectionManager getInstance() {  
  28.         if (instance == null) {  
  29.             try {  
  30.                 instance = new ConnectionManager();  
  31.             } catch (Exception e) {  
  32.                 e.printStackTrace();  
  33.             }  
  34.         }  
  35.         return instance;  
  36.     }  
  37.   
  38.     public synchronized final Connection getConnection() {  
  39.         Connection conn = null;  
  40.         try {  
  41.             conn = dataSource.getConnection();  
  42.         } catch (SQLException e) {  
  43.             e.printStackTrace();  
  44.         }  
  45.         return conn;  
  46.     }  
  47. }  
下面是測試代碼:
[java]  view plain  copy
 
 
 
 
 
  1. package com.zww.server;  
  2.   
  3. import java.sql.Connection;  
  4. import java.sql.PreparedStatement;  
  5. import java.sql.ResultSet;  
  6. import java.sql.SQLException;  
  7.   
  8. import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;  
  9.   
  10.   
  11. public class ConnectionDemo {  
  12.   
  13.     public static void main(String[] args) throws SQLException {  
  14.         System.out.println("使用連接池................................");  
  15.         for (int i = 0; i < 20; i++) {  
  16.             long beginTime = System.currentTimeMillis();  
  17.             Connection conn = ConnectionManager.getInstance().getConnection();  
  18.             try {  
  19.                 PreparedStatement pstmt = conn.prepareStatement("select * from event");  
  20.                 ResultSet rs = pstmt.executeQuery();  
  21.                 while (rs.next()) {  
  22.                      // do nothing...  
  23.                 }  
  24.             } catch (SQLException e) {  
  25.                 e.printStackTrace();  
  26.             } finally {  
  27.                 try {  
  28.                     conn.close();  
  29.                 } catch (SQLException e) {  
  30.                     e.printStackTrace();  
  31.                 }  
  32.             }  
  33.   
  34.             long endTime = System.currentTimeMillis();  
  35.             System.out.println("第" + (i + 1) + "次執行花費時間為:" + (endTime - beginTime));  
  36.         }  
  37.   
  38.         System.out.println("不使用連接池................................");  
  39.         for (int i = 0; i < 20; i++) {  
  40.             long beginTime = System.currentTimeMillis();  
  41.             MysqlDataSource mds = new MysqlDataSource();  
  42.             mds.setURL("jdbc:mysql://localhost:3306/zww");  
  43.             mds.setUser("root");  
  44.             mds.setPassword("123456");  
  45.             Connection conn = mds.getConnection();  
  46.             try {  
  47.                 PreparedStatement pstmt = conn.prepareStatement("select * from event");  
  48.                 ResultSet rs = pstmt.executeQuery();  
  49.                 while (rs.next()) {  
  50.                                     // do nothing...  
  51.                 }  
  52.             } catch (SQLException e) {  
  53.                 e.printStackTrace();  
  54.             } finally {  
  55.                 try {  
  56.                     conn.close();  
  57.                 } catch (SQLException e) {  
  58.                     e.printStackTrace();  
  59.                 }  
  60.             }  
  61.             long endTime = System.currentTimeMillis();  
  62.             System.out.println("第" + (i + 1) + "次執行花費時間為:"  
  63.                                 + (endTime - beginTime));  
  64.         }  
  65.   
  66.     }  

運行結果如下圖所示:

測試結果表明,在使用連接池時,只在第一次初始化時,比較耗時,完成初始化之后,使用連接池進行數據庫操作明顯比不使用連接池花費的時間少。

 


免責聲明!

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



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