JdbcPersistenceManager には常に jdbcConnection を 1 つだけ持たせ、次の方法でインスタンス化するようにしたいと思います: JdbcConnectionManager.getJdbcConnection()
(2004-11-01 | Head First Design Patterns | O'Reilly Media | 688p | Elisabeth Freeman | ISBN-0596007124) から抜粋した単純なパターンを次に示します。
synchronized() は、「これ」または特定の新しい (静的?) フィールドをロックする必要がありますか? どうすればいいですか?
public class JdbcPersistenceManager implements PersistenceManager {
private volatile Connection jdbcConnection;
/* ... */
private Connection getJdbcConnection() throws JdbcConnectionFailureException {
if (jdbcConnection == null) {
synchronized (this) {
if (jdbcConnection == null) {
jdbcConnection =
JdbcConnectionManager.getJdbcConnection(jdbcConnectionParameters);
}
}
}
// label:here
return jdbcConnection;
}
}
jdbcConnection のインスタンス化を想定すると、必要に応じて「label:here」とマークされた時点でも、接続がまだ有効であることを確認し、有効でない場合は再作成する最善の方法は?
ConnectionPooling は、ここでやりたいことではありません。たった1つの接続...「null」または「無効」の場合は再生成/再開します。
編集:
getJdbcConnection にしたいことは次のとおりです。
1) jdbcConnections を配布し、常にそのうちの 1 つだけが存在するようにします (クライアントが 2 つの異なる接続への参照を保持することは許可されません)。
と
2) なんらかの理由で閉じられた場合、「private volatile Connection jdbcConnection」フィールドを再生成します (つまり、JdbcConnectionManager.getJdbcConnection() を再度呼び出します)。
(たとえば、クライアント 1 が接続を取得しますが、接続を閉じます。クライアント 2 が接続し、接続はnullではありませんが使用できないため、再生成された接続を取得します)。
注:クライアント1が接続を取得するのを止めるものは何もないことを認識していますが、クライアント2は設計上同じ接続を取得し、クライアント1が参照を介して接続を閉じてからわずか1ミリ秒で使用します...それが解決可能かどうかはわかりませんまったく?