5

次の接続変数を使用する安全でより良い方法を知りたいです。

最初:クラスのクラスメンバー変数としての接続

class MyClass
{
    Connection conn;

    public MyClass(Connection conn) {
        this.conn = conn;
    }

    public void myMethod(){
        //Do some DB operations using conn
    }
}

2番目:メソッドで接続を初期化

class MyClass
{       
    public MyClass() {      
    }

    public void myMethod(){
        Connection conn= initializeFunction(); //Initialize Connection
        //Do some DB operations using conn
    }
}

3番目:接続を引数として関数に送信します

class MyClass
{       
    public MyClass() {      
    }

    public void myMethod(Connection conn){
        //Do some DB operations using conn
    }
}

注 : 質問はプログラミング言語固有のものではないため、Java 以外のタグも追加しました。

4

8 に答える 8

6

3つのアプローチはすべて、異なる機能を提供します。

  1. クラスは接続オブジェクトを所有しており、オブジェクトが存続している限り、接続オブジェクトは存続します。
  2. 接続オブジェクトはメソッドに対してローカルであり、メソッドが戻ると期限切れになります。
  3. メソッドの呼び出し元は、接続オブジェクトを所有しています。

選択は以下に依存します:

  • 接続オブジェクトの所有権をどのように処理しますか?
  • DB接続は、必要な期間だけ開いている必要があり、常に開いている必要はないことを覚えておく必要があります。
  • データベースに接続する頻度。
于 2012-10-04T07:40:12.997 に答える
5

データベース接続オブジェクトに関して言えば、最善の方法は、できるだけ遅く開き、できるだけ早く閉じることです。

C# には、usingIDisposable インターフェイスを実装するオブジェクトを操作するステートメントがあります。usingステートメントは、コードの try/finally ブロックのように機能します。IMO 接続を処理するための一般的な方法は次のようになります。

try
{
connection = new Connection();
connection.Open(); // open the connection
//work with the connection, DB CRUD operations
}
finally
{
if(connection != null)
     connection.Close(); // close the connection in finally block
                         // so that even if the exception occurs, connection gets closed. 
}

あなたのオプションについては、クラスのオブジェクトとともに接続オブジェクトを保持する最初のオプションが最悪だと思います。

接続のオブジェクトを複数の場所に保持するのではなく、接続の開閉にもっと関心を持つべきだと思います。

于 2012-10-04T07:38:18.020 に答える
4

使用する適切な方法Connectionは、常にConnection内部usingステートメントを宣言することです。

using (var connection = InitializeConnection())
{
}

例外がスローされた場合でも、接続を自動的に閉じるように処理します。

幸い、舞台裏では、ADO.NETは接続プールを使用してデータベースへの接続を自動的に管理および最適化するため、アプリケーションで開いている接続の数を気にする必要はありません。それらは単なる論理接続です。

パフォーマンスが低下し、接続プールの並列アクセスを利用しないため、接続を長く維持しないでください

于 2012-10-04T07:43:10.643 に答える
3

要件に応じて、オプション1または3を選択します。

  • 接続を使用して定義されたメソッドよりも多くのメソッドがある場合は、オプション1を選択します。方法1では、依存性注入制御の反転を簡単に使用できます。

  • クラスのそのメソッドが接続を使用する唯一のメソッドである場合は、オプション3を選択します。

方法2は、接続のモックオブジェクトを定義する方法がないため、テストが困難です。

さらに、ではなくインターフェイスをに渡すことをお勧めしMyClassます。

于 2012-10-04T07:44:01.483 に答える
3

これは、メソッドの外部で Connection オブジェクトを変更する機能を提供するかどうかによって異なります。

個人的には、オプション 1 または 2 Option 1を使用します。MyClass が複数のメソッドが関連付けられたデータベース コンテナーである場合、つまりデータベースへの接続、SharePoint、ストアド プロシージャの実行など Option 2、接続オブジェクトが短期間しか使用されなかった場合、つまり接続を開き、別の場所でデータを処理します。Option 3、 Connection オブジェクトをメソッドに渡すことは好みませんが、これは個人的な好みです。

于 2012-10-04T07:45:26.857 に答える
3

推奨されるソリューションは、プログラミング環境に完全に依存します。Java やその他の長時間実行されるプロセスに当てはまることは、PHP や同様の要求ごとの実行には当てはまりません。

Java では通常、使用する DB 接続プールがあります。これは、データベースへの同時接続数を制限するためにあります。これは、ほとんどの場合アイドル状態であるためです。平均して、コード内のクエリほど多くの接続は必要ありません。しかし一方で、最初のクエリを実行する必要があるときにのみデータベースに接続すると、時間の無駄になります。Java プログラムは常に実行されています。起動時に適切な数の DB 接続を開いてみませんか? その後、必要なときに準備が整います。

PHP では、スクリプトが終了すると、すべてが忘れられてメモリから削除されます。アクティブな進行中の DB 接続を保存する場所がありません。したがって、最善のアプローチは、クエリを送信する必要があることが確実にわかっている瞬間にデータベースに接続することです。一方、PHP で「できるだけ早く閉じる」ことには同意しません。これは、スクリプトが終了するとすぐに閉じられるためです。接続を途中で閉じると、別のクエリのために再度開く必要がある場合があります。

また、PHP の DB 接続用のシングルトンのアイデアにも反対します (Java は別のゲームかもしれません)。はい、通常は 1 つのデータベースしかありませんが、そうでない場合はどうでしょうか? シングルトンを使用すると、2 つのデータベースを使用できなくなります。最初から使用しないでください。mysqli_connect() は、同じ接続パラメーター (サーバー、ユーザー名、パスワード) を使用し、シングルトンのように機能する場合、既存の接続を使用するため、PHP で再度行う必要はありません。

于 2012-10-04T07:51:56.547 に答える
2

少し変更を加えて、2番目のオプションを選択します。の呼び出しをシングルトンオブジェクトに変更するとinitializeFunction()接続が生成されます。その後、不要になった時点で閉じます。

于 2012-10-04T07:39:13.450 に答える
1

接続が多くの方法で使用されるかどうかによって異なります。できるだけ早く開閉することをお勧めしますので、option2が最適です。必要なときに接続を使用するだけです。また、接続をプールするためのc3poライブラリに興味があるかもしれません。

一般に、クラスの他の場所で使用されている変数を削除する場合は、option1を使用して、Connectionをfinalにします。これはdb接続なので、ルールは少し変わると思います。

于 2012-10-04T07:39:39.707 に答える