首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >抽象工厂模式和HikariCP

抽象工厂模式和HikariCP
EN

Stack Overflow用户
提问于 2016-02-25 15:12:56
回答 1查看 152关注 0票数 1

我目前正在使用池连接(Hikari)和抽象工厂模式来实现我的MySQL查询,如下所示:

MySqlFactoryDAO.java

代码语言:javascript
复制
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

代码语言:javascript
复制
public class ProductMySQLFactoryDAO implements ProductDAO {

   public int insertProduct(String name) {  
      ...
      Connection conn = MySqlFactoryDAO.createConnection();
      ...
   }    
}

我想知道这段代码是否是线程安全的,并且我认为在初始化coonPool_时存在问题。我在维基百科上读过像"Initialization-on-demand_holder_idiom“这样的东西,但我对此不太确定。有没有人有更好的实现来解决这个问题,或者只是一个更好的新问题?

EN

回答 1

Stack Overflow用户

发布于 2016-02-25 15:32:39

不,它不是线程安全的。两个线程可以并发地调用createConnection(),两个线程都将池视为null,并且都创建一个新的DataSource。

该方法需要同步。或者必须在类初始化时创建池:

代码语言:javascript
复制
private static final HikariDataSource DATA_SOURCE = createDataSource();

您的connPool_字段也应该是私有的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35620666

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档