我有一个负责与数据库交互的 Java 类,以及几个将同时访问它的对象。
所以,我必须确保在每个时间点,最多执行一个与数据库相关的操作。
我打算在实现以下接口的类中实现这些操作:
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
如果是,你能举个例子吗?