package com.github.ltsopensource.store.jdbc; import com.github.ltsopensource.core.cluster.Config; import com.github.ltsopensource.core.spi.ServiceLoader; import com.github.ltsopensource.store.jdbc.datasource.DataSourceProvider; import javax.sql.DataSource; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; /** * 保证一个DataSource对应一个SqlTemplate * * @author Robert HG (254963746@qq.com) on 3/8/16. */ public class SqlTemplateFactory { private static final ConcurrentMap<DataSource, SqlTemplate> HOLDER = new ConcurrentHashMap<DataSource, SqlTemplate>(); public static SqlTemplate create(Config config) { DataSourceProvider dataSourceProvider = ServiceLoader.load(DataSourceProvider.class, config); DataSource dataSource = dataSourceProvider.getDataSource(config); SqlTemplate sqlTemplate = HOLDER.get(dataSource); if (sqlTemplate != null) { return sqlTemplate; } synchronized (HOLDER) { sqlTemplate = HOLDER.get(dataSource); if (sqlTemplate != null) { return sqlTemplate; } sqlTemplate = new SqlTemplateImpl(dataSource); HOLDER.putIfAbsent(dataSource, sqlTemplate); return sqlTemplate; } } }