背景
公司项目需要用到多个数据源,因为数据来源于不同的系统,所以这里简单描述下 springboot多数据源如何配置与使用, 以及涉及到 多事务管理器如何配置与使用
springboot 配置文件
spring:
datasource:
bigdata:
driver-class-name: com.mysql.jdbc.Driver
url: yoururl
username: username
password: root
jx:
driver-class-name: com.mysql.jdbc.Driver
url: yoururl
username: username
password: root
在yml配置文件中 填写好自己的两个数据源连接信息
mybatis 配置文件
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<setting name="logImpl" value="STDOUT_LOGGING" />
<setting name="cacheEnabled" value="true"/>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="true"/>
<setting name="multipleResultSetsEnabled" value="true"/>
<setting name="useColumnLabel" value="true"/>
<setting name="useGeneratedKeys" value="false"/>
<setting name="autoMappingBehavior" value="PARTIAL"/>
<setting name="defaultExecutorType" value="SIMPLE"/>
<setting name="mapUnderscoreToCamelCase" value="true"/>
<setting name="localCacheScope" value="STATEMENT"/>
<setting name="jdbcTypeForNull" value="NULL"/>
</settings>
<plugins>
<plugin interceptor="com.github.pagehelper.PageHelper">
<property name="dialect" value="mysql"/>
<property name="supportMethodsArguments" value="true"/>
<property name="params" value="pageNum=pageNumKey;pageSize=pageSizeKey;"/>
</plugin>
</plugins>
</configuration>
- settings 里面包含了一些简单的设置 ,这些设置基本写了注释,可以详细看下,可以选择性加一些
- plugins 里面加入了 分页插件,用的是 github开源的插件, 挺好用的,也可以自己写。 自己的写的话可以增加一些特性啥的,具体可以百度,不再赘诉。
编写jdbc配置类
这里为了便于识别,将两个数据源的配置放在了两个configure中
@Configuration
@MapperScan(basePackages = BigdataDataSourceConfig.PACKAGE, sqlSessionFactoryRef = "bigdataSqlSessionFactory")
public class BigdataDataSourceConfig {
static final String PACKAGE = "xxxxxxxx";
static final String MAPPER_LOCATION = "xxxxxxxx";
@Value("${spring.datasource.bigdata.url}")
private String url;
@Value("${spring.datasource.bigdata.username}")
private String user;
@Value("${spring.datasource.bigdata.password}")
private String password;
@Value("${spring.datasource.bigdata.driver-class-name}")
private String driverClass;
@Value("${mybatis.config-location}")
private String configLocation;
@Value("${mybatis.mapper-locations}")
private String mapperLocations;
@Value("${mybatis.type-aliases-package}")
private String typeAliasesPackage;
@Bean(name = "bigdataDataSource")
@Primary
public DataSource bigdataDataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(driverClass);
dataSource.setUrl(url);
dataSource.setUsername(user);
dataSource.setPassword(password);
return dataSource;
}
@Bean(name = "bigdataTransactionManager")
@Primary
public DataSourceTransactionManager bigdataTransactionManager() {
return new DataSourceTransactionManager(bigdataDataSource());
}
@Bean(name = "bigdataSqlSessionFactory")
@Primary
public SqlSessionFactory bigdataSqlSessionFactory(@Qualifier("bigdataDataSource") DataSource bigdataDataSource)
throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(bigdataDataSource);
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources(BigdataDataSourceConfig.MAPPER_LOCATION));
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
sessionFactory.setConfigLocation(resolver.getResource(configLocation));
sessionFactory.setTypeAliasesPackage(typeAliasesPackage);
return sessionFactory.getObject();
}
}
注意点
PACKAGE : *mapper.java 类所在的包路径MAPPER_LOCATION : *mapper.xml 所在的包路径 我这里是 classpath:mapper/bigdata/*.xml sessionFactory.setConfigLocation(resolver.getResource(configLocation)); 加载 自己编写的mybatis 配置类,不然设置的那些参数,以及分页插件不会生效。 (比如 *mapper.xml 查询结果不会自动将下划线转驼峰并映射到 java entity类的字段上, 一般出现这种情况,要么就是 mybatis-config.xml 里面settings没有设置该项, 要么就是没有加载到 mybatis配置文件)@Bean(name = "bigdataTransactionManager") 这里是设置这个数据源的 事务管理器 , 所有通过该数据源的数据库动作都归于这个名字叫“bigdataTransactionManager”的事务管理器
另一个数据源配置类就不贴出来了,基本配置一样 ,但是需要将数据源名称修改一下,然后上述四个注意点也需要按实际情况进行修改。
ServiceImpl
在ServiceImpl文件 中,我们需要使用 @Transcational() 注解来使用 事务管理器。 但是我们实际上注册了两个, 如果不指定事务管理器的, springboot是不知道该使用那个的。 不过我们在注册的时候,在 @Bean(name = "bigdataTransactionManager") , 这一行下面使用了 @Primary 注解。 所以我们的spring 会默认使用 bigdataTransactionManager 这个事务管理器。 如果当你需要用到 另一个事务管理器的时候,你需要在你的 @Transcational 注解中指定事务管理器名称 ps: 可以使用在方法上,也可以加在 serviceImpl文件最上方
@Transactional(readOnly = true, transactionManager = "primaryTxxxxxxxxxxx")
@Transactional(readOnly = true, transactionManager = "anotherTxxxxxxxxxx")
总结
Springboot帮我们做了很多事情, 但是其实明白里面的设计还是比较重要的, 至少你从0搭建一个代码框架的时候不会有太多问题。 记录一下自己的问题,也希望能够帮助到正在学习的各位
|