伝統的なアプローチは、各データクラスに対してDAO(データアクセスオブジェクト)を持つことです。
I.e.データクラス "Person"がある場合、findById()、findAll()、save(Person)などのメソッドを実装する "PersonDAO"クラスもあります。基本的にDAOクラスはすべてのDB相互作用を処理します。
DAOクラスのコンストラクタはConnectionオブジェクトを受け入れるだけで、接続の作成の問題を外部化することも、Connectionオブジェクトを作成したファクトリメソッドを呼び出すこともできます。
どちらの場合でも、このようなファクトリメソッドが必要な場合があります。誰かが指摘
public class Database{
public static Connection getConnection(){
// Create a new connection or use some connection pooling library
}
}
として、あなたは、複数のスレッドがメソッドにアクセスすることはないと確信していない限り、あなたは同じ接続を毎回配るべきではありませんので、java.sql.Connectionのはスレッドセーフではありません。
もちろん、各通話に新しい接続を作成する必要がある場合は、接続が完了したら接続を閉じる必要があります。簡単な方法は、DAOにclose()メソッドを追加して、それを処理させることです。これは、DAOを使用するコードに負担をかけます。
接続プールを使用しても、完了したら接続を閉じて(プールに戻る)必要があります。
スレッドごとに接続するには、スレッドローカルを使用することをお勧めします。これは場合によっては機能しますが、各リクエストが新しいスレッド(再利用されることはなく、参照を保存しない可能性があります)であるWebアプリケーションには役に立ちません。
ただし、各リクエストを処理した後にTreadローカル接続(存在する場合)を閉じるDatabase.closeConnection()が呼び出されるように設定した場合、これをWebアプリケーションで利用できます。
私はあなたの授業でそれを避けるといいです。 – tddmonkey
私はコードでシングルトンとモノステートを使用していますが、過去20年ほど悪影響を及ぼすことはありませんでした。これらはデザイナーツールボックスの単なる別のツールです。 –