我目前正在使用池连接(Hikari)和抽象工厂模式来实现我在Java中的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"在维基百科,但我不确定。有没有人有更好的实现来解决这个问题或只是一个更好的新问题?
答案 0 :(得分:0)
不,它不是线程安全的。两个线程可能同时调用createConnection()
,两者都将池视为null
,并且都创建一个新的DataSource。
该方法需要同步。或者必须在类初始化时创建池:
private static final HikariDataSource DATA_SOURCE = createDataSource();
您的connPool_
字段也应该是私密的。