spring datasource多数据源配置
配置
mybatis.datasource.xxx.configLocation=classpath*:xxx-mybatis.xml
mybatis.datasource.xxx.mapperLocations=classpath*:sqlmap/*/*.xml
mybatis.datasource.xxx.type=com.alibaba.druid.pool.DruidDataSource
mybatis.datasource.xxx.driverClassName=com.mysql.jdbc.Driver
mybatis.datasource.xxx.url=jdbc:mysql://100.xx.xx.31:xxx/xxx?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false
mybatis.datasource.xxx.username=xxx
mybatis.datasource.xxx.password=xxxx
mybatis.datasource.xxx.initialSize=20
mybatis.datasource.xxx.minIdle=20
mybatis.datasource.xxx.maxActive=50
mybatis.datasource.xxx.timeBetweenEvictionRunsMillis=1800
mybatis.datasource.xxx.minEvictableIdleTimeMillis=60000
mybatis.datasource.xxx.maxEvictableIdleTimeMillis=100000
mybatis.datasource.xxx.maxWait=1000
mybatis.datasource.xxx.maxIdleTime=60000
mybatis.datasource.xxx.idleConnectionTestPeriod=60000
mybatis.datasource.xxx.validationQuery=SELECT 1
mybatis.datasource.xxx.testOnBorrow=false
mybatis.datasource.xxx.testWhileIdle=true
mybatis.datasource.xxx.phyTimeoutMillis=25200000
mybatis.datasource.xxx.keepAlive=true
mybatis.datasource.xxx.testOnReturn=false
properties
@Component
@Getter
@Setter
@PropertySource(value = { XXXProperties.LOCATION })
@ConfigurationProperties(prefix = XXXProperties.PREFIX)
public class XXXProperties {
static final String PREFIX = "mybatis.datasource.xxx";
static final String LOCATION = "classpath:application-datasource.properties";
private String mapperLocations;
private String configLocation;
private String type;
private String driverClassName;
}
datasource config
@Configuration
@MapperScan(basePackages = "com.xxxx.mapper", sqlSessionFactoryRef = "xxxSqlSessionFactory")
public class DataSourceConfig {
@Resource
private XxxProperties xxxProperties;
@Resource
private Environment environment;
@Bean(name = "xxxDataSource")
public DataSource xxxDataSource() {
DataSource ds = DataSourceBuilder.create()
.type((Class<? extends DataSource>) ClassUtils.resolveClassName(xxxProperties.getType(), null))
.driverClassName(xxxProperties.getDriverClassName()).build();
return Binder.get(environment).bind(XxxProperties.PREFIX, ds.getClass()).get();
}
@Bean(name = "xxxSqlSessionFactory")
public SqlSessionFactory xxxSqlSessionFactory(@Qualifier("xxxDataSource") DataSource dataSource)
throws Exception {
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
sessionFactory.setConfigLocation(
new PathMatchingResourcePatternResolver().getResources(xxxProperties.getConfigLocation())[0]
);
sessionFactory.setMapperLocations(
new PathMatchingResourcePatternResolver().
getResources(xxxProperties.getMapperLocations()));
return sessionFactory.getObject();
}
@Bean(name = "xxxSqlSession")
public SqlSessionTemplate xxxSqlSession(
@Qualifier("xxxSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
@Bean(name = "xxxTx")
public XxxTransactionManager xxxTx(@Qualifier("xxxDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}
如果需要配置多数据数,则创建多个配置,及DataSourceConfig 并指定相应的mapper
如果dataSource要调整为HighAvailableDataSource及NodeListener的使用方式,则可以如下创建dataSource,并且在配置文件对象中添加url、password及username
DataSource ds = DataSourceBuilder.create()
.type((Class<? extends DataSource>) ClassUtils.resolveClassName(distributionProperties.getType(), null))
.driverClassName(distributionProperties.getDriverClassName())
.build();
DataSource result = Binder.get(environment)
.bind(DistributionProperties.PREFIX, ds.getClass())
.get();
DisfNodeListener nodeListener = new DisfNodeListener();
nodeListener.setUrl(distributionProperties.getUrl());
nodeListener.setUsername(distributionProperties.getUsername());
nodeListener.setPassword(distributionProperties.getPassword());
HighAvailableDataSource highAvailableDataSource = (HighAvailableDataSource) result;
highAvailableDataSource.setNodeListener(nodeListener);
return highAvailableDataSource;