web-dev-qa-db-ja.com

db接続はシングルトンにする必要がありますか?

Javaでシングルトンを作成する最良の方法は何ですか?DB接続はシングルトンである必要があります(シングルトンであるため、自動的にスレッドセーフになります)?理論上、DBには多くの人がアクセスできないため同時にユーザー。

19
spauny

通常、DB接続はシングルトンであってはなりません。

2つの理由:

  1. 多くのDBドライバーはスレッドセーフではありません。シングルトンを使用すると、多くのスレッドがある場合、それらはすべて同じ接続を共有します。シングルトンパターンでは、スレッドの安全性は得られません。多くのスレッドが「グローバル」インスタンスを簡単に共有できるようにするだけです。
  2. 個人的には、シングルトンはしばしば悪いデザインにつながると思います:この投稿を(誰かが)参照してください http://tech.puredanger.com/2007/07/03/pattern-hate-singleton/

これを行う代わりに、データベースプールを検討してください。プールは共有されます(必要に応じてシングルトンにすることもできます)。データベースの作業を行う必要がある場合、コードは次のことを行います。

getConnectioFromPool();

doWork()
closeConnection() // releases back to pool

サンプルプールライブラリ:

27
Dave

シングルトンを作成するbest方法は(現在の時点で)enumシングルトンパターンです( Java enum singleton

データベース接続にはシングルトンが必要か、または価値があるとは思えません。おそらく遅延作成が必要でしょう。接続は最初の要求時に作成され、キャッシュされます。それ以降の要求は、キャッシュされたインスタンスで満たされます。

public ConnectionProvider {
  private Connection conn;

  public static Connection getConnection() {
    if (conn == null || conn.isClosed()) {
      conn = magicallyCreateNewConnection();
    }
    return conn;
  }
}

(スレッドセーフではありません-必要に応じて同期します)

4
Andreas_D

シングルトンを作成するJavaの最良の方法は何ですか?

設計パターン作成ガイドラインに従ってください。つまり、プライベートコンストラクタなど.

DB接続はシングルトンである必要がありますか(シングルトンであるため、自動的にスレッドセーフになります)?

シングルトンとしてDB接続を作成することは、多くのシナリオで設計上の選択として不適切な場合があります。 DBの同時実行性が必要ないことが確実な場合にのみ使用してください。複数のユーザーが同時にログインしている場合、または単一のユーザーがDBにアクセスする必要のある多くのスレッドを生成する場合でも、DB接続プールの方が適しています。 ApacheまたはTomcatのいずれかのdb接続プールを使用できます。これらのクラスは、たとえばパッケージで定義されています

org.Apache.commons.dbcp.*;

org.Apache.Tomcat.dbcp.dbcp.*;

ここで、dbcpはデータベース接続プールを表します。

接続プールを使用する最大の理由は、平均してDBアクセス(DMLなど)にかかる時間が、接続を作成してから接続を閉じるのにかかる時間よりもはるかに短いことです。さらに、トランザクションが完了したら、ResultSet、PreparedStatement、およびConnection変数を閉じることを忘れないでください。

理論的には、DBには多くのユーザーが同時にアクセスすることはできません。

何故なの?ほとんどの場合、DBは同時に使用するためのものです。これらのDB分離レベル-READ_COMMITTED、READ_UNCOMMITTED、SERIALIZEDなどがあります。SERIALIZEDは、DBがシングルユーザーアクセスになる場合です。

3
Basanth Roy

シングルトンはパターンです。パターンを作成する明示的な方法はなく、設計のプラクティスに従うだけです。

したがって、同時読み取り/書き込みを処理できるデータベース(MySQLなど)を使用している場合は、スレッドの安全性についてそれほど心配する必要はありません。同時書き込みがうまく機能しないDB(SQLite)を使用している場合は、理論的にはシングルトンが機能します。

2
jefflunt