0

私の現在の設計パターンには、1 つのコンビニエンス クラスに多数のデータベース アクセス メソッドが含まれています。インスタンス化されると、必要な接続を取得し、メソッドを待機します。

その接続で10個のメソッドを実行しようとしているときに単一の接続を開く方が、10個の個別のメソッドごとにその接続を開いたり閉じたりするよりも優れていると私は考えていました。

ただし、これらの接続を閉じていないことに気付きました。私は、戻ってメソッドへのすべての呼び出しをリファクタリングし、closeConnectionsすべてのアクティブな接続を解放するメソッドを含める必要があるという結論に達しました。

私の質問は次のとおりです。適切な設計慣行に従って、すべてのメソッドで接続を開いたり閉じたりする必要がありますか (これにはかなりのオーバーヘッドが発生します)、またはcloseConnectionsメソッドへの呼び出しを使用してコンビニエンス クラスへの呼び出しをリファクタリングする必要があります。

疑似コード

class convenience{
    public contructor(){
        a = new Connection();
    }

    public void methodA(){
        /* do stuff */
    }
    public void methodB(){
        /* do stuff */
    }
    public void methodC(){
        /* do stuff */
        //should I do this?
        a = new Connection();
        /* do stuff */
        a.close();
    }
    public void close(){
        //or this
        a.close();
    }
}
4

3 に答える 3

1

おそらく、この便利なクラスで接続を保持するのではなく、メソッド呼び出しごとに渡す必要があります。そうすれば、接続の存続期間を制御でき、たとえば、トランザクションを便利な方法で使用できます。

また、この接続をこのコンビニエンス クラス内に保持すると、接続を複数のスレッドと共有するリスクが高まりますが、これは一般的にはお勧めできません。

c3p0、DBCP、BoneCP (およびその他) などの接続プールを使用することで、接続の開閉にかかるコストを軽減または削除できます。

于 2012-04-18T18:18:41.487 に答える
0

接続を開くときはいつでも、それをサービスに登録することをお勧めします。その後、特定の接続が開いているか、すでに閉じているかをサービスで確認して、アプリケーションのリークを追跡できます。

于 2012-04-18T18:24:06.020 に答える
0

優れた設計慣行に従う

それが必要な場合は、車輪を再発明しないでください。接続プールを使用します。

于 2012-04-18T18:28:18.543 に答える