一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

數(shù)據(jù)庫連接池的應(yīng)用與研究

 李副營長 2014-03-16
          對(duì)Java初學(xué)者來說,數(shù)據(jù)庫連接池同其它的XX池一樣,看起來是很神秘的一種技術(shù),其實(shí)都是難者不會(huì),會(huì)者不難的情況。當(dāng)了解了數(shù)據(jù)庫連接池技術(shù)之后,數(shù)據(jù)庫連接池并不神秘而是一個(gè)非常簡(jiǎn)單的小技巧。
      為什么會(huì)有數(shù)據(jù)庫連接池呢?對(duì)于一個(gè)系統(tǒng)來說,如果沒有數(shù)據(jù)庫連接,當(dāng)你每次需要進(jìn)行數(shù)據(jù)庫操作時(shí),都要獲取連接,完成操作之后將連接關(guān)閉。當(dāng)系統(tǒng)訪問量上來之后,你就會(huì)發(fā)現(xiàn)系統(tǒng)將會(huì)有大量的實(shí)踐都花在獲取數(shù)據(jù)庫連接和關(guān)閉連接上。因此如果我們建立一個(gè)數(shù)據(jù)庫連接池,在系統(tǒng)啟動(dòng)時(shí),一次性的獲取若干條數(shù)據(jù)庫連接加入到連接池中,當(dāng)我們需要進(jìn)行數(shù)據(jù)庫操作時(shí),直接從數(shù)據(jù)庫連接池中拿到連接,用完之后不再關(guān)閉,而是將其放入連接池中,這樣系統(tǒng)運(yùn)行時(shí)將再不會(huì)有頻繁的獲取連接和關(guān)閉連接了。下面,我們就自己寫一個(gè)簡(jiǎn)單的數(shù)據(jù)庫連接池,并加以測(cè)試。
      1. ConnectionPool類:數(shù)據(jù)庫連接池類. 運(yùn)用單例模式,當(dāng)要進(jìn)行數(shù)據(jù)庫操作時(shí),先調(diào)用ConnectionPool.getInstance()方法,獲取數(shù)據(jù)庫連接池的實(shí)例,然后調(diào)用connectionPool.getConnection()方法獲取數(shù)據(jù)庫連接,使用完連接之后調(diào)用connectionPool.release(Connection conn)來代替connection.close()方法來將獲得的連接釋放到連接池中,以便重復(fù)利用。這樣就解決了頻繁打開和關(guān)閉數(shù)據(jù)庫連接池的問題。
       ConnectionPool.java
Java代碼 
  1. public class ConnectionPool {  
  2.       
  3.     private List<Connection> connections ;  
  4.     private int poolSize = 1;//  
  5.     private String url;  
  6.     private String username;  
  7.     private String password;  
  8.     private String driverClassName;  
  9.       
  10.     private static ConnectionPool instance = null;  
  11.       
  12.     private ConnectionPool() {  
  13.         initialize();  
  14.     }  
  15.       
  16.     /** 
  17.      * 初始化方法 
  18.      */  
  19.     private void initialize() {  
  20.         connections = new ArrayList<Connection>(poolSize);  
  21.         readConfig();  
  22.         addConnection();  
  23.     }  
  24.       
  25.     /** 
  26.      * 讀取數(shù)據(jù)庫連接池的配置文件 
  27.      */  
  28.     private void readConfig() {  
  29.         String path = System.getProperty("user.dir")+"/resources/config/jdbc.properties";  
  30.         try {  
  31.             FileInputStream is = new FileInputStream(path);  
  32.             Properties prop = new Properties();  
  33.             prop.load(is);  
  34.             driverClassName = prop.getProperty("jdbc.driverClassName");  
  35.             url = prop.getProperty("jdbc.url");  
  36.             username = prop.getProperty("jdbc.username");  
  37.             password = prop.getProperty("jdbc.password");  
  38.             poolSize = Integer.parseInt(prop.getProperty("jdbc.poolSize"));  
  39.         } catch (Exception e) {  
  40.             e.printStackTrace();  
  41.         }  
  42.     }  
  43.       
  44.     /** 
  45.      * 往數(shù)據(jù)庫連接池中添加連接 
  46.      */  
  47.     private void addConnection() {  
  48.         for (int i=0; i < poolSize; i++) {  
  49.             try {  
  50.                 Class.forName(driverClassName);  
  51.                 Connection connection = java.sql.DriverManager.getConnection(url, username, password);  
  52.                 connections.add(connection);  
  53.             } catch (ClassNotFoundException e) {  
  54.                 e.printStackTrace();  
  55.             } catch (SQLException e) {  
  56.                 e.printStackTrace();  
  57.             }  
  58.         }  
  59.     }  
  60.       
  61.     /** 
  62.      * 獲取數(shù)據(jù)庫連接池 
  63.      * @return 
  64.      */  
  65.     public static ConnectionPool getConnectionPoolInstance() {  
  66.         if (instance == null) instance = new ConnectionPool();  
  67.         return instance;  
  68.     }  
  69.       
  70.     /** 
  71.      * 從數(shù)據(jù)庫連接池中獲取數(shù)據(jù)庫連接 
  72.      * @return 
  73.      */  
  74.     public synchronized Connection getConnection() {  
  75.         if (connections.size() <= 0) return null;  
  76.         Connection connection = connections.get(0);  
  77.         connections.remove(0);  
  78.         return connection;  
  79.     }  
  80.       
  81.     /** 
  82.      * 釋放數(shù)據(jù)庫連接 
  83.      * 使用完數(shù)據(jù)庫連接池之后調(diào)用這個(gè)方法來代替close方法 
  84.      * @param connection 
  85.      */  
  86.     public synchronized void realase(Connection connection) {  
  87.         connections.add(connection);  
  88.     }  
  89.       
  90.     /** 
  91.      *  關(guān)閉數(shù)據(jù)庫連接池 
  92.      */  
  93.     public synchronized void closePool() {  
  94.         for (int i =0; i < connections.size(); i++) {  
  95.             Connection connection = connections.get(i);  
  96.             try {  
  97.                 connection.close();  
  98.             } catch (SQLException e) {  
  99.                 e.printStackTrace();  
  100.             }  
  101.             connections.remove(i);  
  102.         }  
  103.     }  
  104. }  

          2.  jdbc.propeties  數(shù)據(jù)庫連接池配置文件,初始化數(shù)據(jù)庫連接池時(shí)使用到。
          
Xml代碼 
  1. jdbc.driverClassName=oracle.jdbc.xa.client.OracleXADataSource  
  2. jdbcjdbc.url=jdbc:oracle:thin:@127.0.0.1:1521:mgodb  
  3. jdbc.username=CAR  
  4. jdbc.password=CAR  
  5. jdbc.poolSize=10  


         3. ConnectionPoolTest類: 測(cè)試類,  通過與不使用數(shù)據(jù)庫連接池進(jìn)行數(shù)據(jù)庫訪問所消耗的時(shí)間進(jìn)行對(duì)比,為了使測(cè)試盡可能準(zhǔn)確,通過100次循環(huán)調(diào)用,對(duì)比時(shí)間總和。
          ConnectionPoolTest.java
Java代碼 
  1. public class ConnectionPoolTest extends TestCase {  
  2.   
  3.     public void testConnectionPoolTest() throws Exception {  
  4.         String sql = "SELECT * FROM T_CR_CAR_TYPE_BRAND";  
  5.         ConnectionPool connectionPool = null;  
  6.         long starttime = System.currentTimeMillis();  
  7.         for (int i = 0; i < 100; i++) {  
  8.             connectionPool = ConnectionPool.getConnectionPoolInstance();  
  9.             Connection conn = connectionPool.getConnection();  
  10.             ResultSet rs;  
  11.             Statement stmt = conn.createStatement();  
  12.             rs = stmt.executeQuery(sql);  
  13.             while (rs.next()) {  
  14.             }  
  15.             rs.close();  
  16.             stmt.close();  
  17.             rs = null;  
  18.             stmt = null;  
  19.             connectionPool.realase(conn);  
  20.         }  
  21.         connectionPool.closePool();  
  22.         System.out.println("經(jīng)過100次循環(huán)調(diào)用,使用連接池花費(fèi)的時(shí)間:"  
  23.                 + (System.currentTimeMillis() - starttime) + "ms\n");  
  24.   
  25.         String driverClassName = "oracle.jdbc.xa.client.OracleXADataSource";  
  26.         String url = "jdbc:oracle:thin:@127.0.0.1:1521:mgodb";  
  27.         String username = "CAR";  
  28.         String password = "CAR";  
  29.         starttime = System.currentTimeMillis();  
  30.         for (int i = 0; i < 100; i++) {  
  31.             Class.forName(driverClassName);  
  32.             Connection conn = DriverManager.getConnection(url, username,  
  33.                     password);  
  34.             Statement stmt = conn.createStatement();  
  35.             ResultSet rs = stmt.executeQuery(sql);  
  36.             while (rs.next()) {  
  37.             }  
  38.             rs.close();  
  39.             stmt.close();  
  40.             conn.close();  
  41.             rs = null;  
  42.             stmt = null;  
  43.             conn = null;  
  44.         }  
  45.         System.out.println("經(jīng)過100次循環(huán)調(diào)用,不使用連接池花費(fèi)的時(shí)間:" + (System.currentTimeMillis() - starttime) + "ms\n");  
  46.     }  
  47. }  

          通過測(cè)試結(jié)果可以發(fā)現(xiàn),使用數(shù)據(jù)庫連接池所消耗的實(shí)踐要小于不使用數(shù)據(jù)庫連接池的,當(dāng)調(diào)用的次數(shù)增加時(shí),差異將會(huì)更加明顯。
          當(dāng)然這個(gè)數(shù)據(jù)庫連接池僅僅是用來了解數(shù)據(jù)庫連接池的原理而已,對(duì)于超時(shí)的連接并沒有強(qiáng)制收回的機(jī)制,也沒有限制用戶調(diào)用close方法來關(guān)閉連接。僅供學(xué)習(xí)。。。。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    欧美国产日韩在线综合| 最近日韩在线免费黄片| 午夜视频成人在线免费| 日韩人妻精品免费一区二区三区| 国产又粗又猛又爽色噜噜| 激情少妇一区二区三区| 亚洲最新中文字幕一区| 少妇高潮呻吟浪语91| 国产精品香蕉免费手机视频| 成人午夜视频精品一区| 欧美不卡午夜中文字幕| 国产精品午夜福利免费在线| 精品一区二区三区人妻视频| 九九热视频网在线观看| 99久久婷婷国产亚洲综合精品| 国产午夜福利在线免费观看| 福利新区一区二区人口| 超碰在线播放国产精品| 久久热在线免费视频精品| 成人欧美精品一区二区三区| 老司机激情五月天在线不卡| 亚洲高清中文字幕一区二区三区| 国产精品视频第一第二区| 成年午夜在线免费视频| 国产又粗又猛又爽色噜噜| 国产成人精品一区二区三区| 国产老女人性生活视频| 国产偷拍盗摄一区二区| 99久久精品免费精品国产| 国产亚洲精品香蕉视频播放| 欧美一区二区不卡专区| 欧美日韩国产欧美日韩| 色欧美一区二区三区在线| 九九九热在线免费视频| 爱草草在线观看免费视频| 开心激情网 激情五月天| 国内精品伊人久久久av高清| 欧美多人疯狂性战派对| 高清不卡一卡二卡区在线 | 国产午夜精品福利免费不| 东京热男人的天堂久久综合|