ホイールのデータベース接続プール
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)方法を使用することを規定する.この方法は簡単で、私は を実現しませんでした.
次に、主な実装コードを示します.
池の最大接続、最小接続、タイミングなどの多くは実現していませんが、簡単に固定接続数を作っただけです.
ブログの参考になりました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つのプールに接続された健康診断メカニズムに関連する
以上の理解に対して、プログラミングでは、以下のように実現することができる.
次に、主な実装コードを示します.
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つのプールに接続された健康診断メカニズムに関連する