<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    為什么要使用連接池?
    連接池一般比直接連接更有優越性因為它提高了性能的同時還保存了寶貴的資源。打開數據庫連接時CPU和網絡的重要任務因此,在整個應用程序的使用過程當中重復的打開直接連接將導致性能的下降。而池連接只在服務器啟動時打開一次,從而消除了這種性能問題。另外,因為連接只用于很短的時間,所以,連接可以被有效共享,而且有關連接參數的特有信息,只對池驅動程序有效,如數據庫用戶名稱和密碼,從而增強了系統的安全性和可管理性。
    打個比方:
    一輛汽車想從河的此岸到彼岸,這之間沒有橋,怎么辦呢?架橋吧。
    橋架好了,車過去了。
    然后呢?這個橋是拆掉呢?還是接著供以后使用呢?
    如果是拆掉,那么就相當于數據庫的直連,數據庫的每一個連接,都需要架一所橋,數據操作之后也就是說“車”通過之后,拆掉此橋。
    如果是保留,那么就相當于使用了“連接池”技術,不過也并非“一座橋”這么簡單。

    主要思想:
      是基于JDBC而來的
      JDBC方法:開啟一個Connection,使用一個連接,關閉一個連接。
                  再次操作重復上面的。
                  而開啟一個連接對象浪費很多服務器資源。
      數據庫連接池:通過參數配置(參數看你需要綜合考慮)開啟N個連接 放在容器中(Tomcat,weblogic等)
                  使用連接,釋放連接。注意不是關閉,從新放回容器中,等待下次使用,無需再次開啟連接。


    實現其基本功能的核心代碼:

     1 package com.linying;
     2 
     3 import java.sql.Connection;
     4 import java.sql.DriverManager;
     5 import java.sql.SQLException;
     6 import java.util.LinkedList;
     7 
     8 /**
     9  * 加工數據源,實現連接池
    10  * @author Ying-er
    11  * @time 2010-2-1下午06:47:03
    12  * @version 1.0
    13  */
    14 public class MyDataSource {
    15     /**
    16      * 指定數據庫的URL
    17      */
    18     private String url = "jdbc:mysql://127.0.0.1/test";
    19 
    20     /**
    21      * 指定登陸用戶名
    22      */
    23     private String user = "root";
    24 
    25     /**
    26      * 指定登陸用戶的密碼
    27      */
    28     private String password = "1234";
    29 
    30     /**
    31      * 初始連接數(一次性創建50個連接)
    32      */
    33     private int initCount = 50;
    34 
    35     /**
    36      * 記錄當前連接數
    37      */
    38     int currentCount = 0;
    39 
    40     /**
    41      * 使用LinkedList的connectionPool存儲MyConnection對象
    42      */
    43     LinkedList<Connection> connectionPool = new LinkedList<Connection>();
    44 
    45     /**
    46      * 構造函數 創建MyDataSource時創建initCount個連接
    47      * 
    48      */
    49     public MyDataSource() {
    50         try {
    51             for (int i = 0; i < initCount; i++) {
    52                 this.connectionPool.addLast(this.createConnection());
    53                 this.currentCount++;
    54             }
    55         } catch (SQLException e) {
    56             throw new ExceptionInInitializerError(e);
    57         }
    58     }
    59 
    60     /**
    61      * 創建連接
    62      * 
    63      * @return
    64      * @throws SQLException
    65      */
    66     private Connection createConnection() throws SQLException {
    67         Connection realConnection = DriverManager.getConnection(url, user,
    68                 password);
    69         MyConnection myConnection = new MyConnection(realConnection, this);
    70         return myConnection;
    71     }
    72 
    73     /**
    74      * 從連接池里獲得連接
    75      * 
    76      * @return
    77      * @throws SQLException
    78      */
    79     public Connection getConnection() throws SQLException {
    80         synchronized (connectionPool) {
    81             if (this.connectionPool.size() > 0) {
    82                 return this.connectionPool.removeFirst();
    83             } else {
    84                 this.currentCount++;
    85                 return this.createConnection();
    86             }
    87 
    88         }
    89     }
    90 
    91     /**
    92      * 釋放連接
    93      * 
    94      * @param conn
    95      */
    96     public void free(Connection conn) {
    97         this.connectionPool.addLast(conn);
    98     }
    99 }

     1 package com.linying;
     2 
     3 import java.sql.Array;
     4 import java.sql.Blob;
     5 import java.sql.CallableStatement;
     6 import java.sql.Clob;
     7 import java.sql.Connection;
     8 import java.sql.DatabaseMetaData;
     9 import java.sql.NClob;
    10 import java.sql.PreparedStatement;
    11 import java.sql.SQLClientInfoException;
    12 import java.sql.SQLException;
    13 import java.sql.SQLWarning;
    14 import java.sql.SQLXML;
    15 import java.sql.Savepoint;
    16 import java.sql.Statement;
    17 import java.sql.Struct;
    18 import java.util.Map;
    19 import java.util.Properties;
    20 /**
    21  * 自定義Connection
    22  * @author Ying-er
    23  * @time 2010-2-1下午06:36:24
    24  * @version 1.0
    25  */
    26 public class MyConnection implements Connection{
    27     
    28     private Connection realConnection;
    29     private MyDataSource dataSource;
    30     private int maxUserCount=200;
    31     private int currentUserCount=0;
    32     
    33     MyConnection(Connection connection,MyDataSource dataSource){
    34         this.realConnection=connection;
    35         this.dataSource=dataSource;
    36     }
    37 
    38     public void clearWarnings() throws SQLException {
    39         // TODO Auto-generated method stub
    40         this.realConnection.clearWarnings();
    41         
    42     }
    43 
    44     /**
    45      * 重寫close方法,
    46      * close的時候
    47      * 將此已用過的數據源添加到LinkedList尾部
    48      * 此LinkedList在MyDataSource文件中定義
    49      * 注意:目的是釋放而不是不是關閉數據源
    50      */
    51     public void close() throws SQLException {
    52         // TODO Auto-generated method stub
    53         this.currentUserCount++;
    54         if(this.currentUserCount<this.maxUserCount){
    55             this.dataSource.connectionPool.addLast(this);
    56         }
    57         else{
    58             this.realConnection.close();
    59             this.dataSource.currentCount--;
    60         }
    61         
    62     }
    63     
    64     /**
    65      * 實現Connection中的所有方法
    66      * ……
    67      */
    68 
    69     public void commit() throws SQLException {
    70         // TODO Auto-generated method stub
    71         this.realConnection.commit();
    72         
    73     }
    74     /**
    75      * 以下代碼略掉
    76      */

    此實例工程下載地址:
    http://m.tkk7.com/Files/crazycoding/DBConnectionPool.rar

    注:只是個人研究成果,有錯誤和不準確之處請諒解。

    posted on 2010-02-01 19:06 Ying-er 閱讀(372) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲人成网站在线观看播放| 性色av免费观看| 亚洲av无码专区在线播放| 国产精品永久免费视频| 中文字幕亚洲综合久久菠萝蜜| 日韩在线视频免费| 亚洲欧洲自拍拍偷精品 美利坚| 国产午夜亚洲精品不卡电影| 亚洲国产午夜福利在线播放| www成人免费视频| 亚洲无线码一区二区三区| 久草福利资源网站免费| 久久久久久久亚洲Av无码| 亚洲精品视频在线免费| 亚洲人成网站色在线观看| 亚洲精品无码久久久久去q| 国产免费AV片在线观看播放| 亚洲综合无码精品一区二区三区| 国产婷婷成人久久Av免费高清| 久久亚洲精品成人| 免费观看四虎精品成人| 红杏亚洲影院一区二区三区| 亚洲熟妇无码AV不卡在线播放| 国产成人无码区免费A∨视频网站| 一本久久免费视频| 亚洲视频精品在线| 67194成是人免费无码| 美女视频黄a视频全免费网站色| 亚洲精品高清无码视频| 亚洲免费人成视频观看| 婷婷亚洲综合五月天小说在线| 亚洲无线观看国产精品| 67194熟妇在线永久免费观看| 亚洲一区二区三区电影| 国产乱子精品免费视观看片| 色婷婷六月亚洲综合香蕉| 亚洲AV无码码潮喷在线观看| 成年网站免费视频A在线双飞| 成人午夜影视全部免费看| 日产亚洲一区二区三区| 免费A级毛片无码A|