springboot双数据源配置
pom文件中添加双数据库的依赖文件
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.14</version>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
</dependency>
application文件中的双数据源配置
spring.profiles.active=dev
server.port=8082
server.servlet.context-path=/api
server.error.whitelabel.enabled=false
# spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration
spring.redis.host=*****
spring.redis.database=1
spring.redis.port=6379
spring.redis.timeout=30s
spring.redis.max-idle=10
spring.redis.max-total=10
spring.redis.max-wait-millis=300000
app.datasource.url=*****
app.datasource.username=***
app.datasource.password=***
app.datasource.max-pool-size=10
app.datasource.min-idle=5
ez.datasource.url=jdbc:postgresql:*****
ez.datasource.password=****
ez.datasource.max-pool-size=10
ez.datasource.min-idle=5
mybatis.configuration.map-underscore-to-camel-case=true
mybatis.typeAliasesPackage=*****
mybatis.mapper-locations=classpath:mybatis/mapper/app/*Mapper.xml
spring.servlet.multipart.enabled=true
# Threshold after which files are written to disk.
spring.servlet.multipart.file-size-threshold=2KB
# Max file size.
spring.servlet.multipart.max-file-size=512MB
# Max Request Size
spring.servlet.multipart.max-request-size=512MB
## File Storage Properties
# All files uploaded through the REST API will be stored in this directory
file.upload-dir=./uploads
wx.mini.appid=*****
wx.mini.secret=*****
spring.swagger.host: hradmin.ezcel.com
#logging.level.com.hr.admin.dao.app=debug
#logging.level.com.hr.admin=info
#logging.path=logs
#logging.file=app.log
mapper文件分数据源编写
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.spring.dao.ez.LogDAO">
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.spring.dao.app.MenuDAO">
dao层分数据源编写
分为两个包里文件编写
config配置两个数据源信息
第一个数据源信息
@Slf4j
@Configuration
@EnableConfigurationProperties(AppDataSourcePropertiesConfiguration.class)
@MapperScan(basePackages = "com.spring.dao.app", sqlSessionFactoryRef = AppDataSourceConfiguration.SQL_SESSION_FACTORY_NAME)
@EnableTransactionManagement
public class AppDataSourceConfiguration {
public static final String SQL_SESSION_FACTORY_NAME = "appSessionFactory";
@Autowired
private AppDataSourcePropertiesConfiguration appDataSourcePropertiesConfiguration;
@Bean(name = "appDataSource")
public DataSource appDataSource() {
HikariConfig config = new HikariConfig();
config.setJdbcUrl(appDataSourcePropertiesConfiguration.getUrl());
config.setUsername(appDataSourcePropertiesConfiguration.getUsername());
config.setPassword(appDataSourcePropertiesConfiguration.getPassword());
config.setMaximumPoolSize(appDataSourcePropertiesConfiguration.getMaxPoolSize());
config.setMinimumIdle(appDataSourcePropertiesConfiguration.getMinIdle());
config.setAutoCommit(true);
return new HikariDataSource(config);
}
@DependsOn("appDataSource")
@Bean(name = AppDataSourceConfiguration.SQL_SESSION_FACTORY_NAME)
public SqlSessionFactory sqlSessionFactoryBean(@Qualifier("appDataSource") DataSource appDataSource) {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
PathMatchingResourcePatternResolver resource = new PathMatchingResourcePatternResolver();
try {
org.apache.ibatis.session.Configuration ibatisConfiguration = new org.apache.ibatis.session.Configuration();
ibatisConfiguration.setMapUnderscoreToCamelCase(true);
sqlSessionFactoryBean.setConfiguration(ibatisConfiguration);
sqlSessionFactoryBean.setMapperLocations(resource.getResources("classpath:mybatis.mapper/app/*Mapper.xml"));
sqlSessionFactoryBean.setDataSource(appDataSource);
return sqlSessionFactoryBean.getObject();
} catch (Exception e) {
throw new RuntimeException();
}
}
@Bean(name = "AppSqlSessionTemplate")
public SqlSessionTemplate createSqlSessionTemplate(@Qualifier(AppDataSourceConfiguration.SQL_SESSION_FACTORY_NAME) SqlSessionFactory sqlSessionFactory) {
log.info("----------init sqlSessionTemplate !!! ");
return new SqlSessionTemplate(sqlSessionFactory);
}
//primary表明是主事务管理器
@DependsOn("appDataSource")
@Bean(name = "ApptxManager")
@Primary
public PlatformTransactionManager txManager(@Qualifier("appDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}
@Data
@ConfigurationProperties("app.datasource")
public class AppDataSourcePropertiesConfiguration {
private String url;
private String username;
private String password;
private int maxPoolSize;
private int minIdle;
}
第二个数据源信息
@Data
@ConfigurationProperties("ez.datasource")
public class EzDataSourcePropertiesConfiguration {
private String url;
private String username;
private String password;
private int maxPoolSize;
private int minIdle;
}
/**
* @Author: ZJY
* @Date: 2019-01-02 10:10
*/
@Slf4j
@Configuration
@EnableConfigurationProperties(EzDataSourcePropertiesConfiguration.class)
@MapperScan(basePackages = "com.spring.dao.ez", sqlSessionFactoryRef = EzDataSourceConfiguration.SQL_SESSION_FACTORY_NAME)
@EnableTransactionManagement
public class EzDataSourceConfiguration {
public static final String SQL_SESSION_FACTORY_NAME = "ezSessionFactory";
@Autowired
private EzDataSourcePropertiesConfiguration ezDataSourcePropertiesConfiguration;
@Bean(name = "ezDataSource")
public DataSource ezDataSource() {
HikariConfig config = new HikariConfig();
config.setJdbcUrl(ezDataSourcePropertiesConfiguration.getUrl());
config.setUsername(ezDataSourcePropertiesConfiguration.getUsername());
config.setPassword(ezDataSourcePropertiesConfiguration.getPassword());
config.setMaximumPoolSize(ezDataSourcePropertiesConfiguration.getMaxPoolSize());
config.setMinimumIdle(ezDataSourcePropertiesConfiguration.getMinIdle());
return new HikariDataSource(config);
}
@DependsOn("ezDataSource")
@Bean(name = EzDataSourceConfiguration.SQL_SESSION_FACTORY_NAME)
public SqlSessionFactory sqlSessionFactoryBean(@Qualifier("ezDataSource") DataSource ezDataSource) {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
PathMatchingResourcePatternResolver resource = new PathMatchingResourcePatternResolver();
try {
org.apache.ibatis.session.Configuration ibatisConfiguration = new org.apache.ibatis.session.Configuration();
ibatisConfiguration.setMapUnderscoreToCamelCase(true);
sqlSessionFactoryBean.setConfiguration(ibatisConfiguration);
sqlSessionFactoryBean.setMapperLocations(resource.getResources("classpath:mybatis.mapper/ez/*Mapper.xml"));
sqlSessionFactoryBean.setDataSource(ezDataSource);
return sqlSessionFactoryBean.getObject();
} catch (Exception e) {
throw new RuntimeException();
}
}
@Bean(name="EzSqlSessionTemplate")
public SqlSessionTemplate createSqlSessionTemplate(@Qualifier(EzDataSourceConfiguration.SQL_SESSION_FACTORY_NAME) SqlSessionFactory sqlSessionFactory) {
log.info("----------init sqlSessionTemplate !!! ");
return new SqlSessionTemplate(sqlSessionFactory);
}
//事务管理器
@DependsOn("ezDataSource")
@Bean(name = "EztxManager")
public PlatformTransactionManager txManager(@Qualifier("ezDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}
/*
@Override
public PlatformTransactionManager annotationDrivenTransactionManager() {
return txManager;
}*/
}
常见问题
- 可能存在数据源按照类型注入会失败
- 因为缺少数据库驱动导致连接失败