データベースとの対話を担当する Java クラスと、それに同時にアクセスするいくつかのオブジェクトがあります。
そのため、どの時点でも、データベース関連の操作が 1 つだけ実行されるようにする必要があります。
次のインターフェースを実装するクラスでこれらの操作を実装する予定です。
public interface IPersistenceAction<T> {
T run(final IPersistenceState aPersistenceState);
}
IPersistenceState
java.sql.Connection
およびへの参照が含まれていますjava.sql.Statement
:
public interface IPersistenceState {
void setStatement(final Statement aStatement);
Statement getStatement();
void setConnection(final Connection aConnection);
Connection getConnection();
}
IPersistence
インターフェイスを実装するクラスは、
- 接続が利用可能になるまで待ちます (つまり、誰もそれを使用しなくなります)。
- データベース関連の操作の特定のセットを実行し、
- 操作の結果を返します。
すべてのデータベース関連の操作は異なるタイプの結果を返す可能性があるため、そのタイプを指定する必要があることに注意してT
くださいIPersistenceAction<T>
Javaで説明された同じこと:
public class Persistence implements IPersistence {
private IPersistenceState state; // Contains connection and statement
private boolean busy = false; // Indicates whether someone uses the object at the moment
public T runAction(IPersistenceAction<T> action)
{
T returnValue = null;
waitUntilIdle();
synchronized (this) {
busy = true;
returnValue = action.run(state);
busy = false;
notifyAll();
}
return returnValue;
}
...
}
これは Java 構文に違反しています。
しかし、Java 7 以降、Java 言語仕様にはクロージャがあります。
それらを使用して、異なる結果(異なるs)を持つデータベース操作のスレッドセーフ実行のタスクを解決できますか?T
はいの場合、例を挙げていただけますか?