我应该同步 DataSource 的 getConnection() 吗
Should I synchronize getConnection() of DataSource
我有这个带有连接池的单例。
public enum ConnectionPool {
INSTANCE;
private DataSource ds = null;
ConnectionPool() {
try {
final Context initCtx = new InitialContext();
ds = (DataSource) initCtx.lookup("java:comp/env/jdbc/test");
} catch (NamingException e) {
e.printStackTrace();
}
}
public Connection getConnection() throws SQLException {
return ds.getConnection();
}
}
我是否应该同步 getConnection() 以防止从不同的线程获取相同的实例?看起来它已经被 Tomcat 同步了,但我不确定(我使用 Tomcat 8)。
虽然 java 文档中没有明确提及,但 DataSource#getConnection
方法被设计为在单个 DataSource 实例上同时调用。
一般情况下您不需要提供客户端级同步。
java 文档中的限制可能被省略以提供实施的灵活性。
嗯,你一开始就不应该有这个 "ConnectionPool"。考虑使用经过测试的实际执行连接池的。
无论如何,您的 class 的线程安全性与 DataSource
的线程安全性相同,因为您委托给它并且它是您拥有的唯一共享状态。 JDBC API 中没有任何内容可以确保线程安全,因此您需要检查实现细节。
我有这个带有连接池的单例。
public enum ConnectionPool {
INSTANCE;
private DataSource ds = null;
ConnectionPool() {
try {
final Context initCtx = new InitialContext();
ds = (DataSource) initCtx.lookup("java:comp/env/jdbc/test");
} catch (NamingException e) {
e.printStackTrace();
}
}
public Connection getConnection() throws SQLException {
return ds.getConnection();
}
}
我是否应该同步 getConnection() 以防止从不同的线程获取相同的实例?看起来它已经被 Tomcat 同步了,但我不确定(我使用 Tomcat 8)。
虽然 java 文档中没有明确提及,但 DataSource#getConnection
方法被设计为在单个 DataSource 实例上同时调用。
一般情况下您不需要提供客户端级同步。
java 文档中的限制可能被省略以提供实施的灵活性。
嗯,你一开始就不应该有这个 "ConnectionPool"。考虑使用经过测试的实际执行连接池的。
无论如何,您的 class 的线程安全性与 DataSource
的线程安全性相同,因为您委托给它并且它是您拥有的唯一共享状态。 JDBC API 中没有任何内容可以确保线程安全,因此您需要检查实现细节。