抽象工厂模式和HikariCP

时间:2016-02-25 07:12:56

标签: java mysql design-patterns jdbc hikaricp

我目前正在使用池连接(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"在维基百科,但我不确定。有没有人有更好的实现来解决这个问题或只是一个更好的新问题?

1 个答案:

答案 0 :(得分:0)

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

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

private static final HikariDataSource DATA_SOURCE = createDataSource();

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