【发布时间】:2017-07-26 09:49:06
【问题描述】:
我正在使用 Tomcat JDBC 连接池。
在多线程场景中,使用 DataSource 对象的静态实例是否安全?
这就是我在需要时获得连接的方式:
public static Connection getConnection() throws SQLException {
return datasource.getConnection();
}
运行查询后,我确保关闭连接。
【问题讨论】:
-
您的数据源是否标记为最终数据源?出于安全发布的目的,应将数据源引用标记为 final。
-
不是,我是这样定义的:private static DataSource datasource;
-
这不是线程安全的
-
@rvit34 它可能不是线程安全的,但如果该字段只分配一次,那么它可能是线程安全的(除了可能的发布问题)。
-
我将数据源实例化修改为:private static final DataSource datasource = new DataSource();我将属性设置如下: public static void initializeConnection(Properties properties) { PoolProperties poolProp = setPoolProperties(properties);数据源.setPoolProperties(poolProp);在创建其他线程之前,这只会在开始时调用一次。