我有连接池的singelton。
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)。
答案 0 :(得分:7)
虽然在java docs中没有明确提到,DataSource#getConnection
方法被设计为在单个DataSource实例上同时调用。
在一般情况下,您无需提供客户端级别的同步。
可能省略了java docs中的限制,以便为实现提供灵活性。
答案 1 :(得分:1)
嗯,你不应该首先拥有这个“ConnectionPool”。考虑使用经过测试的实际连接池。
无论如何,你的类的线程安全性是DataSource
的线程安全性,因为你委托它,它是你拥有的唯一共享状态。 JDBC API中没有任何内容可以确保线程安全,因此您需要检查实现细节。