package phoenix.datasource.davincicode.datasource; import java.util.Map; import java.util.Properties; import org.apache.commons.lang3.Validate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy; import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.pool.DruidDataSourceFactory; import com.google.common.eventbus.Subscribe; import lombok.Getter; import lombok.Setter; import phoenix.datasource.davincicode.model.ConfigItem; public class DataSourceUnit extends LazyConnectionDataSourceProxy { private static final Logger LOG = LoggerFactory.getLogger(DataSourceUnit.class); private String davinciCode; @Setter @Getter private String instanceIp; @Setter @Getter private String dbName; @Setter @Getter private String privilege; private ConfigItem configItem; public void close() { if (getTargetDataSource() instanceof DruidDataSource) { ((DruidDataSource) getTargetDataSource()).close(); } } @Subscribe public void handleEvent(Map<String, ConfigItem> config) { if (!config.containsKey(this.davinciCode)) return; ConfigItem ci = config.get(this.davinciCode); if (this.configItem != null && this.configItem.getVersion() >= ci.getVersion()) return; try { setTargetDataSource(DruidDataSourceFactory.createDataSource(buildProperties(ci))); super.afterPropertiesSet(); getTargetDataSource().getConnection().isValid(1000); this.configItem = ci; } catch (Exception e) { LOG.error("DataSourceUnit Handle Event Error : ", e); Validate.isTrue(false, e.getMessage()); } } public Properties buildProperties(ConfigItem ci) { Properties ps = new Properties(); ps.setProperty("username", ci.getCurrentAccount().getUsername()); ps.setProperty("password", ci.getCurrentAccount().getPassword()); for (Map.Entry<String, String> item : ci.getProperties().entrySet()) { ps.setProperty(item.getKey(), item.getValue()); } return ps; } @Override public void afterPropertiesSet() { this.davinciCode = instanceIp + "|" + dbName + "|" + privilege; } }