2016-02-25 253 views
1

我目前使用的池連接(光速)和抽象工廠模式在Java中實現我的MySQL查詢像這樣:抽象工廠模式和HikariCP

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

不,它不是線程安全的。兩個線程可能同時調用createConnection(),都將該池視爲null,並且都會創建一個新的DataSource。

該方法需要同步。或游泳池必須在類初始化時創建:

private static final HikariDataSource DATA_SOURCE = createDataSource(); 

connPool_場應該是私有的,太。

+0

是的,它應該是私人的,我把它複製錯了。我想過一種同步方法,但它認爲在這裏同步會降低性能。 – amarincolas