2016-02-25 6 views
1

Я в настоящее время с помощью подключения к бассейну (Hikari) и абстрактной модели фабрики реализовать свои запросы MySQL в Java, как это:Абстрактный узор завод и 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.

Метод должен быть синхронизирован. Или пул должен быть создан в классе INITIALIZING время:

private static final HikariDataSource DATA_SOURCE = createDataSource(); 

Ваше connPool_ поле должно быть частным, тоже.

+0

Да, он должен быть закрытым, я копирую его неправильно. Я думал о синхронизированном методе, но он считает, что синхронизация здесь значительно снижает производительность. – amarincolas

Смежные вопросы