ホイールのデータベース接続プール

2879 ワード

スレッドプールは私の理解について話しましょう.
  • まず固定数の接続を作成し、その後、1つのコンテナに
  • を配置する.
  • 使用時に容器から
  • を取り出す
  • コンテナ内の接続数は0以下であり、すべての接続を取得する動作は待機する.
  • コンテナ内の接続数が0より大きい場合、接続が取得され、接続が終了するとコンテナ内の
  • に戻る.
    以上の理解に対して、プログラミングでは、以下のように実現することができる.
  • 固定接続を作成し、LinkedListにおいて、これがチェーンテーブル操作であることを選択すると削除効率が高い
  • が追加される.
  • LinkedList.size()<=0の場合、この動作はwait()動作
  • を実行する.
  • LinkedList.size()>0の場合、接続接続接続を取得するConnection con配信取得者は
  • を使用する
  • 使用者がconを使用した後、close()を呼び出すと、LinkedListにconが追加され、これがプログラミングの難点
  • である.
  • プログラミングの難点について、私は2つのソリューション
  • を持っています.
  • エージェントを使用し、ユーザがconを取得すると、エージェント後のconを返す.これにより、クライアントがconのcloseを使用すると、実際にLiskedList.add()メソッド
  • が実行される.
  • は、使用者が特定のclose(Connection con)方法を使用することを規定する.この方法は簡単で、私は
  • を実現しませんでした.
    次に、主な実装コードを示します.
    public Connection getConnection() throws SQLException {
            synchronized(MysqlUtils.class) {
                while(list.size() <= 0 ) {
                    try {
                        log.info(Thread.currentThread().getName() + " wait() " );
                        MysqlUtils.class.wait();
                    } catch (InterruptedException e) {
                        log.error(" Thread " + Thread.currentThread().getName()
                                + "  wait() error!");
                    }
                }
            
            final Connection con = list.removeFirst();
            Connection conn =  (Connection) Proxy.newProxyInstance(MysqlUtils.class.getClassLoader()
                , new Class[]{Connection.class}
                ,new InvocationHandler() {
                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                    if(!method.getName().equals("close")) {
                        return method.invoke(con, args);
                    } else {
                        synchronized(MysqlUtils.class) {
                            list.add(con);
                            MysqlUtils.class.notifyAll();
                            log.info(Thread.currentThread().getName() + " release connection ");
                            return null;
                        }
                    }
                }
            });
            
            return conn;
        
            }
        }

    池の最大接続、最小接続、タイミングなどの多くは実現していませんが、簡単に固定接続数を作っただけです.
    ブログの参考になりましたhttp://www.cnblogs.com/xdp-gacl/p/4002804.html ブログのコードは、特に指摘して、私自身の総括です
    以上、何か間違いがあったら、ご指摘ください.今も勉強中ですから、一緒に進歩しましょう.
    12階:frankiegao 123は2012-01-21 13:14にこのコメントに返信しました生産環境で使用できる接続プールは最低以下の条件を備える必要があります:1:javax.sql.DataSourceインタフェースを実現しました2:接続プールから取得した接続は、Connection#closeを呼び出すときに本当の意味で接続を閉じるわけではありません.プールに戻す3:プール内の接続がデータベース・サービス・エンドによって閉じられた場合、これらの接続は4:接続回収の問題をどのように処理しますか.最大50個の接続が設定されている場合、コンカレント量が高い場合にちょうどこの50個の接続が使用され、高コンカレント期間が経過した場合、10個の接続しか使用されていない場合、残りの40個は回収されるべきであり、これらの貴重なリソースを占有することはできない5:ネットワークが中断した後に再接続された場合、プール内の接続はどのように処理され、これは3と類似している.1つのプールに接続された健康診断メカニズムに関連する