优化动态数据源

This commit is contained in:
zhouhao
2017-12-21 13:51:55 +08:00
parent 96bc62dd5a
commit c2fea04378
3 changed files with 16 additions and 32 deletions

View File

@@ -1,4 +1,4 @@
package org.hswebframework.web.datasource.starter;
package org.hswebframework.web.datasource;
import org.aopalliance.intercept.MethodInterceptor;
import org.hswebframework.web.AopUtils;

View File

@@ -3,15 +3,13 @@ package org.hswebframework.web.datasource;
import org.hswebframework.ezorm.rdb.executor.SqlExecutor;
import org.hswebframework.web.datasource.config.DynamicDataSourceConfigRepository;
import org.hswebframework.web.datasource.config.InSpringDynamicDataSourceConfig;
import org.hswebframework.web.datasource.service.InMemoryDynamicDataSourceService;
import org.hswebframework.web.datasource.service.InSpringContextDynamicDataSourceService;
import org.hswebframework.web.datasource.service.InSpringDynamicDataSourceConfigRepository;
import org.hswebframework.web.datasource.starter.AopDataSourceSwitcherAutoConfiguration;
import org.hswebframework.web.datasource.switcher.DataSourceSwitcher;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -39,9 +37,10 @@ public class DynamicDataSourceAutoConfiguration implements BeanPostProcessor {
@Bean
@ConditionalOnMissingBean(DynamicDataSourceService.class)
public InMemoryDynamicDataSourceService inMemoryDynamicDataSourceService(DynamicDataSourceConfigRepository<InSpringDynamicDataSourceConfig> repository, DataSource dataSource) {
public InSpringContextDynamicDataSourceService inMemoryDynamicDataSourceService(DynamicDataSourceConfigRepository<InSpringDynamicDataSourceConfig> repository,
DataSource dataSource) {
DynamicDataSourceProxy dataSourceProxy = new DynamicDataSourceProxy(null, dataSource);
return new InMemoryDynamicDataSourceService(repository, dataSourceProxy);
return new InSpringContextDynamicDataSourceService(repository, dataSourceProxy);
}
@Override
@@ -69,5 +68,4 @@ public class DynamicDataSourceAutoConfiguration implements BeanPostProcessor {
}
}
}

View File

@@ -11,57 +11,43 @@ import org.springframework.context.ApplicationContext;
import javax.sql.DataSource;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CountDownLatch;
import java.util.stream.Collectors;
/**
* 基于spring容器的动态数据源服务从spring容器中获取数据源
*
* @author zhouhao
* @since 1.0
* @since 3.0
*/
public class InMemoryDynamicDataSourceService extends AbstractDynamicDataSourceService<InSpringDynamicDataSourceConfig> {
public class InSpringContextDynamicDataSourceService extends AbstractDynamicDataSourceService<InSpringDynamicDataSourceConfig> {
@Autowired
private ApplicationContext applicationContext;
@Autowired
public void setApplicationContext(ApplicationContext applicationContext) {
this.applicationContext = applicationContext;
}
public InMemoryDynamicDataSourceService(DynamicDataSourceConfigRepository<InSpringDynamicDataSourceConfig> repository, DynamicDataSource defaultDataSource) {
public InSpringContextDynamicDataSourceService(DynamicDataSourceConfigRepository<InSpringDynamicDataSourceConfig> repository, DynamicDataSource defaultDataSource) {
super(repository, defaultDataSource);
}
public InMemoryDynamicDataSourceService(DynamicDataSourceConfigRepository<InSpringDynamicDataSourceConfig> repository, DataSource dataSource) throws SQLException {
public InSpringContextDynamicDataSourceService(DynamicDataSourceConfigRepository<InSpringDynamicDataSourceConfig> repository, DataSource dataSource) throws SQLException {
super(repository, dataSource);
}
@Deprecated
public void registerDataSource(String id, DataSource dataSource) {
InSpringDynamicDataSourceConfig config = new InSpringDynamicDataSourceConfig();
config.setId(id);
config.setName(id);
CountDownLatch countDownLatch = new CountDownLatch(1);
dataSourceStore.put(id, new DataSourceCache(0L
, new DynamicDataSourceProxy(id, dataSource), countDownLatch, config));
countDownLatch.countDown();
}
@Override
protected DataSourceCache createCache(InSpringDynamicDataSourceConfig config) {
DataSource dataSource = applicationContext.getBean(config.getBeanName(), DataSource.class);
CountDownLatch countDownLatch = new CountDownLatch(1);
try {
return new DataSourceCache(config.hashCode(), new DynamicDataSourceProxy(config.getId(), dataSource), countDownLatch, config);
return new DataSourceCache(config.hashCode(),
new DynamicDataSourceProxy(config.getId(), dataSource),
countDownLatch,
config);
} finally {
countDownLatch.countDown();
}
}
}