このトピックをカバーする質問は見つからなかったので、次のシナリオの解決策を共有したいと思いました。答えは明らかかもしれませんが、私は長い道のりをたどって見つけました。:)質問と回答の両方、および他の解決策へのフィードバックをいただければ幸いです。
シナリオ:
マルチスレッドプログラムがあり、プログラムの他の部分ではまったく必要ないのに、プログラムの一部の機能にデータベース接続(または他の共有オブジェクト)が必要であるとします。ただし、dbへの接続は1つだけである必要があります。
同時に、データベース接続の損失を検出し、その場で再接続を試みます。
これをカバーするために、接続オブジェクトを返す前に接続の有効性もチェックする遅延読み込みパターン「getter」を実装します。
コードは次のようになります。
public class Main {
private DB _db;
public static void main(String[] args) {
new Main().start();
}
private void start() {
// Program code goes here
// You create several threads, some of which may call getDB() whenever they need DB access
}
public DB getDB() {
if (_db == null) {
_db = getDBConnection();
} else if (!_db.isConnectionValid()) {
/*
* DB connection is not valid anymore. Let's close it and
* try to get a new connection.
*/
_db.close();
_db = getDBConnection();
}
return _db;
}
private DB getDBConnection() {
DB db;
// Obtain a new connection...
...
return db;
}
}
問題:
複数のスレッドがほぼ同時にdb接続を取得しようとする場合があります。一部のクラスがそれらへの参照を保持している場合、複数の接続が共存する可能性さえあります。