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

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

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

    有問題可聯系我QQ:429810818

    posts - 4, comments - 6, trackbacks - 0, articles - 8

    自定義jdbc連接池

    Posted on 2012-09-15 17:49 張力 閱讀(300) 評論(0)  編輯  收藏
    最近一直想自己封裝下jdbc,寫個orm,在此拿出來分享分享我的代碼,讓高人指點指點,共同進步,也做個備份
    先上代碼
    DataSource.java
    package org.tension.framework.common.das;

    import java.io.InputStream;
    import java.util.Iterator;

    import org.dom4j.Document;
    import org.dom4j.Element;
    import org.dom4j.io.SAXReader;


    /**
    * 數據源
    * @author tension
    *
    */
    public class DataSource {
    protected static String driverClassName;
    protected static String url;
    protected static String user;
    protected static String password;
    protected static int poolSize;
    protected static int maxUseCount;
    protected static int maxPoolSize;
    protected static int minPoolSize;
    protected static String transaction_Isolation;

    static{
    try {
    InputStream ips = DataSource.class.getClassLoader().getResourceAsStream("user-config.xml");
    SAXReader reader = new SAXReader();
    Document doc = null;
    doc = reader.read(ips);
    Element root = doc.getRootElement();
    Element  module = root.element("module");
    Element group = module.element("group");
    Iterator<?> configValue = group.elementIterator("configValue");
    while(configValue.hasNext()){
    Element e = (Element) configValue.next();
    String key = e.attributeValue("key");
    String value = e.getText();
    if("DriverClass".equalsIgnoreCase(key)){
    driverClassName = value;
    }else if("Url".equalsIgnoreCase(key)){
    url = value;
    }else if("UserName".equalsIgnoreCase(key)){
    user = value;
    }else if("Password".equalsIgnoreCase(key)){
    password = value;
    }else if("PoolSize".equalsIgnoreCase(key)){
    poolSize = Integer.valueOf(value);
    }else if("MaxUseCount".equalsIgnoreCase(key)){
    maxUseCount = Integer.valueOf(value);
    }else if("MaxPoolSize".equalsIgnoreCase(key)){
    maxPoolSize = Integer.valueOf(value);
    }else if("MinPoolSize".equalsIgnoreCase(key)){
    minPoolSize = Integer.valueOf(value);
    }else if("Transaction-Isolation".equalsIgnoreCase(key)){
    transaction_Isolation = value;
    }
    }
    Class.forName(driverClassName);
    } catch (Exception e) {
    throw new ExceptionInInitializerError(e);
    }
    }
    }
    至于為什么沒有去實現DataSource接口,我覺得我暫時不用它,所有沒有去實現


    ConnectionPool.java
    package org.tension.framework.common.das;

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    import java.util.LinkedList;

    /**
    *
    * 2012-9-12
    *
    * @author <a href="mailto:429810818@qq.com">tension</a>
    *
    */
    public class ConnectionPool extends DataSource{
    /**當前連接數*/
    int currentCount = 0;

    LinkedList<Connection> connectionsPool = new LinkedList<Connection>();


        /**
         * 默認構造方法,一次性獲得poolSize個連接放進connectionsPool連接池中
         */
    public ConnectionPool() {
    CreateConnectionPool(poolSize);
    }
    /**
    * 獲取連接記錄當前連接個數
    * 如果連接池還有連接則直接從連接池取連接,如果連接大于最大連接數
    * @return
    * @throws SQLException
    */
    public Connection getConnection() throws SQLException {
    synchronized (connectionsPool) {
    if (this.connectionsPool.size() > 0){
    this.currentCount++;
    return this.connectionsPool.removeFirst();
    }
                if(this.currentCount < maxPoolSize){
                int buffer = this.currentCount + minPoolSize;
                if (buffer < maxPoolSize || buffer == maxPoolSize) {
        this.currentCount++;
        CreateConnectionPool(minPoolSize);
        }else{
        this.currentCount++;
        CreateConnectionPool(buffer - maxPoolSize);
        }
                return this.connectionsPool.removeFirst();
                }

    throw new SQLException("暫無連接可用");
    }
    }
    /**
    * 創建連接放入連接池中,緩沖連接池
    * @param count 個數
    */
    public void CreateConnectionPool(int count){
    try {
    for (int i = 0; i < count; i++) {
    this.connectionsPool.addLast(this.createConnection());
    this.currentCount++;
    }
    } catch (SQLException e) {
    throw new ExceptionInInitializerError(e);
    }
    }
        /**
         * 釋放連接方法
         * 把用完的連接重新放回連接池中
         * @param conn
         */
    public void free(Connection conn) {
    this.connectionsPool.addLast(conn);
    }
        /**
         * 創建連接
         * @return warpedConnection
         * @throws SQLException
         * @author tension
         */
    private Connection createConnection() throws SQLException {
    Connection realConn = DriverManager.getConnection(url, user, password);
    ConnectionHandler proxy = new ConnectionHandler(this);
    return proxy.bind(realConn);
    }
    }
    這個就是所謂的連接池了,簡單,沒有現在主流的那么NB,供學習

    ConnectionHandler
    package org.tension.framework.common.das;

    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    import java.sql.Connection;

    /**
    * 連接池的代理類
    * 用于處理Connection的colse方法,把連接放回連接池
    * @author tension
    * 2012-09-12
    */
    class ConnectionHandler  extends DataSource implements InvocationHandler{
    /**真正的連接對象 */
    private Connection realConnection;
    /**代理的連接對象 */
    private Connection warpedConnection;
    /**連接池*/
    private  ConnectionPool conn;
    /**當前用戶使用的次數*/
    private int currentUserCount = 0;
        /**
         * 默認構造方法
         * @param conn 連接池
         */
    ConnectionHandler(ConnectionPool conn) {
    this.conn = conn;
    }
        /**
         * java.sql.Connection的代理方法
         * @param realConn warpedConnection 代理后的對象
         * @return
         */
    Connection bind(Connection realConn) {
    this.realConnection = realConn;
    this.warpedConnection = (Connection) Proxy.newProxyInstance(this
    .getClass().getClassLoader(), new Class[] { Connection.class },
    this);
    return warpedConnection;
    }
        /**
         * 方法攔截
         * 如果為close方法的話不直接調用真正Connection的close方法
         * 如果使用次數小于5次的話就放回連接池中否則關閉這個連接
         */
    public Object invoke(Object proxy, Method method, Object[] args)
    throws Throwable {
    if ("close".equals(method.getName())) {
    this.currentUserCount++;
    if (maxUseCount == 0 || this.currentUserCount < maxUseCount)
    this.conn.connectionsPool.addLast(this.warpedConnection);
    else {
    this.realConnection.close();
    this.conn.currentCount--;
    }
    }
    return method.invoke(this.realConnection, args);
    }

    }
    Connection的代理,主要是修改colse方法
    user-config.xml
    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <application>
        <module name="DataSource">
    <group name="default">
    <configValue key="DriverClass">oracle.jdbc.driver.OracleDriver</configValue>
    <configValue key="Url">jdbc:oracle:thin:@tension:1521:ORCL</configValue>
    <configValue key="UserName">xxx</configValue>
    <configValue key="Password">ooo</configValue>
    <configValue key="PoolSize">1</configValue><!-- 初始大小 -->
    <configValue key="MaxUseCount">0</configValue> <!-- 最大連接數 使用次數-->
    <configValue key="MaxPoolSize">3</configValue> <!-- 最大連接數 -->
    <configValue key="MinPoolSize">2</configValue><!-- 每次增長 -->
    <configValue key="Transaction-Isolation">ISOLATION_READ_COMMITTED</configValue><!-- 事物隔離級別 -->
    </group>
        </module>

    </application>

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


    網站導航:
     
    主站蜘蛛池模板: 亚洲娇小性色xxxx| 在线观看亚洲AV日韩A∨| 亚洲区小说区激情区图片区| 亚洲成A人片777777| 亚洲女人影院想要爱| 精品国产亚洲一区二区三区在线观看| 青青草97国产精品免费观看| 99精品在线免费观看| 暖暖日本免费在线视频| 成人午夜亚洲精品无码网站| 亚洲国产精品综合久久网各| 成年人网站免费视频| 久久亚洲av无码精品浪潮| 亚洲另类春色校园小说| 免费无码又爽又刺激高潮软件 | 亚洲婷婷天堂在线综合| 国产精品免费观看| 亚洲免费综合色在线视频| 搡女人免费免费视频观看| 全免费一级午夜毛片| 亚洲视频免费播放| 中文字幕乱理片免费完整的| 免费黄网在线观看| 色吊丝性永久免费看码| 国产美女无遮挡免费视频网站| 亚洲国产成人91精品| 日本牲交大片免费观看| 成人免费av一区二区三区| 4480yy私人影院亚洲| 免费无码看av的网站| 手机看片国产免费永久| 亚洲免费人成视频观看| 国产伦一区二区三区免费| 亚洲欧美不卡高清在线| 亚洲中文字幕无码久久精品1| 久久精品国产免费观看| 亚洲美免无码中文字幕在线| 黄页网址在线免费观看| 全部免费国产潢色一级| 亚洲免费观看视频| 久久精品国产亚洲AV网站|