/** * */ package jframe.datasource.druid; import java.sql.Connection; import java.sql.SQLException; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import jframe.core.plugin.PluginException; import jframe.core.plugin.annotation.InjectPlugin; import jframe.core.plugin.annotation.Injector; import jframe.core.plugin.annotation.Start; import jframe.core.plugin.annotation.Stop; import jframe.datasource.DataSourcePlugin; import jframe.datasource.DataSourceService; import jframe.datasource.MultiDataSourceService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * @author dzh * @date Dec 25, 2014 10:39:46 AM * @since 1.0 */ @Injector public class MultiDataSourceServiceImpl implements MultiDataSourceService { static final Logger LOG = LoggerFactory .getLogger(MultiDataSourceServiceImpl.class); public static final String MULTI_DS_ID = "multi.datasource"; public static final String PREFIX_FILE = "file."; @InjectPlugin static DataSourcePlugin _plugin; Map<String, DataSourceService> dsMap = new HashMap<String, DataSourceService>(); @Start public void start() { String[] ids = _plugin.getConfig(MULTI_DS_ID, "").split("\\s+"); for (String id : ids) { DruidServiceImpl ds = new DruidServiceImpl(); try { ds.initDataSource(_plugin.getConfig(PREFIX_FILE + id)); } catch (PluginException e) { LOG.error("{} -> " + e.getMessage(), id); System.exit(1); } dsMap.put(id, ds); } } @Stop public void stop() { final Map<String, DataSourceService> dsMap = this.dsMap; if (dsMap != null) { Iterator<DataSourceService> iter = dsMap.values().iterator(); while (iter.hasNext()) { try { iter.next().closeService(); } catch (Exception e) { LOG.error(e.getMessage()); } } dsMap.clear(); } } @Override public DataSourceService getDataSourceService(String id) { return dsMap.get(id); } @Override public Connection getConnection(String id) throws SQLException { DataSourceService ds = getDataSourceService(id); if (ds == null) throw new SQLException("Not found datasource service {}", id); return ds.getConnection(); } @Override public void recycleConnection(String id, Connection conn) throws SQLException { DataSourceService ds = getDataSourceService(id); if (ds == null) throw new SQLException("Not found datasource service {}", id); ds.recycleConnection(conn); } @Override public void closeConnection(String id, Connection conn) throws SQLException { DataSourceService ds = getDataSourceService(id); if (ds == null) throw new SQLException("Not found datasource service {}", id); ds.closeConnection(conn); } }