在实际项目中,一个微服务需要与多个不同的数据库进行交互。使用 Druid 作为连接池,有助于提高数据源的性能和可靠性。通过这种方式,微服务可以在数据库或数据集群之间保持高效的交互,实现更复杂的业务逻辑。
1. 引入依赖
xml
<!-- 多数据源连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.21</version>
</dependency>
2. 连接配置
java
spring:
datasource:
test1:
jdbc-url: jdbc:mysql://localhost:3306/demo?setUnicode=true&characterEncoding=utf8&useSSL=false&autoReconnect=true
driver-class-name: com.mysql.jdbc.Driver
username: root
password: 123456
initialSize: 10
minIdle: 30
maxActive: 30
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
3. 多数据源配置类
getResources("classpath:mapper/test1/*.xml") 中数据源test1会自动扫描test1文件夹下面的所有mapper.xml文件
java
import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.sql.DataSource;
@Configuration
@MapperScan(basePackages = {"cn.cjc.mapper.test1"}, sqlSessionFactoryRef = "test1SqlSessionFactory")
public class Test1DataSourceConfig {
@Value("${spring.datasource.test1.jdbc-url}")
private String url;
@Value("${spring.datasource.test1.driver-class-name}")
private String driverClassName;
@Value("${spring.datasource.test1.username}")
private String username;
@Value("${spring.datasource.test1.password}")
private String password;
@Value("${spring.datasource.test1.initialSize}")
private int initialSize;
@Value("${spring.datasource.test1.minIdle}")
private int minIdle;
@Value("${spring.datasource.test1.maxActive}")
private int maxActive;
@Value("${spring.datasource.test1.maxWait}")
private int maxWait;
@Value("${spring.datasource.test1.timeBetweenEvictionRunsMillis}")
private int timeBetweenEvictionRunsMillis;
@Value("${spring.datasource.test1.minEvictableIdleTimeMillis}")
private int minEvictableIdleTimeMillis;
@Bean(name = "test1DataSource")
public DataSource dataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl(url);
dataSource.setDriverClassName(driverClassName);
dataSource.setUsername(username);
dataSource.setPassword(password);
dataSource.setInitialSize(initialSize);
dataSource.setMinIdle(minIdle);
dataSource.setMaxActive(maxActive);
dataSource.setMaxWait(maxWait);
dataSource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
dataSource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
dataSource.setValidationQuery("select 1");
dataSource.setTestWhileIdle(true);
return dataSource;
}
@Bean(name = "test1SqlSessionFactory")
public SqlSessionFactory sqlSessionFactory(@Qualifier("test1DataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/test1/*.xml"));
return bean.getObject();
}
@Bean(name = "test1TransactionManager")
public DataSourceTransactionManager transactionManager(@Qualifier("test1DataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "test1SqlSessionTemplate")
public SqlSessionTemplate sqlSessionTemplate(@Qualifier("test1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
}