我希望 JdbcPersistenceManager 始终只有一个 jdbcConnection 并通过以下方式对其进行实例化: JdbcConnectionManager.getJdbcConnection()
这是取自 (2004-11-01 | Head First Design Patterns | O'Reilly Media | 688p | by Elisabeth Freeman | ISBN-0596007124) 的简单模式,可能被误用、误解和不合适。
synchronized() 应该锁定“this”还是专门用于跟踪锁定的特定新(静态?)字段?我该怎么做?
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 不是我想在这里做的。只有一个连接......如果它是“null”或“invalid”,则重新生成/重新打开它。
编辑:
我想要 getJdbcConnection 做的是:
1) 提供 jdbcConnections,确保在任何给定时间只存在其中一个(不应允许客户端保留对 2 个不同连接的引用)
和
2) 重新生成(即重新调用 JdbcConnectionManager.getJdbcConnection())“private volatile Connection jdbcConnection”字段,如果由于某种原因它被关闭了
(例如,客户端 1 出现,获得连接但关闭它,客户端 2 出现,连接不为空但无法使用,因此她获得了重新生成的连接)。
注意:我意识到没有什么可以阻止客户端 1 获得连接,而客户端 2 获得相同的连接,按照设计,并且在客户端 1 通过他的参考关闭它后仅一毫秒使用它......我不知道这是否可以解决有吗?