我目前正在使用池连接(Hikari)和抽象工厂模式来实现我的MySQL查询,如下所示:
MySqlFactoryDAO.java
public class MySqlFactoryDAO extends FactoryDAO {
private static HikariDataSource connPool_;
public static Connection createConnection() throws SQLException {
if (connPool_ == null) {
// Load database configuration
PropertiesFile props = FactoryConfig.getConfig().getDatabaseProperties();
connPool_ = new HikariDataSource();
connPool_.setJdbcUrl(props.getString(Params.DB_URL,""));
connPool_.setUsername(props.getString(Params.DB_USER,"root"));
connPool_.setPassword(props.getString(Params.DB_PASSWORD,"root"));
}
return connPool_.getConnection();
}
//-------------------------------------------------------------------------
public ProductDAO getProductDAO() {
return new ProductMySQLFactoryDAO();
}
}ProductMySQLFactoryDAO.java
public class ProductMySQLFactoryDAO implements ProductDAO {
public int insertProduct(String name) {
...
Connection conn = MySqlFactoryDAO.createConnection();
...
}
}我想知道这段代码是否是线程安全的,并且我认为在初始化coonPool_时存在问题。我在维基百科上读过像"Initialization-on-demand_holder_idiom“这样的东西,但我对此不太确定。有没有人有更好的实现来解决这个问题,或者只是一个更好的新问题?
发布于 2016-02-25 15:32:39
不,它不是线程安全的。两个线程可以并发地调用createConnection(),两个线程都将池视为null,并且都创建一个新的DataSource。
该方法需要同步。或者必须在类初始化时创建池:
private static final HikariDataSource DATA_SOURCE = createDataSource();您的connPool_字段也应该是私有的。
https://stackoverflow.com/questions/35620666
复制相似问题