1.多数据源垂直分割模式
创建 application.yml文件写入数据源配置
spring:
datasource:
test1: #数据源1
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://localhost:3306/test1?useSSL=false&useUnicode=true&characterEncoding=utf8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC&allowMultiQueries=true&allowPublicKeyRetrieval=true
username: root
password: 123456
test2: #数据源2
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://localhost:3306/test2?useSSL=false&useUnicode=true&characterEncoding=utf8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC&allowMultiQueries=true&allowPublicKeyRetrieval=true
username: root
password: 123456
新建两个数据库
创建两个数据源配置(DataSourceOneConfig.class,DataSourceTwoConfig.class)
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.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.sql.DataSource;
import java.beans.ConstructorProperties;
//DateSource01
@Configuration
@MapperScan(basePackages = "com.huangan.mapper.test1",sqlSessionFactoryRef = "test1SqlSessionFactory")
public class DataSourceOneConfig {
/**
* 扫描配置文件
* @return
*/
@Bean(name = "test1DataSource")
@ConfigurationProperties(prefix = "spring.datasource.test1")
public DataSource testDataSource(){
return DataSourceBuilder.create().build();
}
/**
* sql会话工厂
* @param dataSource
* @return
* @throws Exception
*/
@Bean(name = "test1SqlSessionFactory")
@Primary
public SqlSessionFactory testSqlSessionFactory(@Qualifier("test1DataSource") DataSource dataSource) throws Exception{
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
//指定mapper文件地址
//bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:/mapping/test1/*.xml"));
return bean.getObject();
}
/**
* 事务管理
* @param dataSource
* @return
*/
@Bean(name = "test1TransactionManager")
public DataSourceTransactionManager testTransactionManager(@Qualifier("test1DataSource") DataSource dataSource){
return new DataSourceTransactionManager(dataSource);
}
/**
* 模板
* @param sqlSessionFactory
* @return
* @throws Exception
*/
@Bean(name = "test1SqlSessionTemplate")
public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("test1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception{
return new SqlSessionTemplate(sqlSessionFactory);
}
}
创建两个dao文件写入sql
@Component
public interface UserMapper1 extends BaseMapper<TUser> {
@Insert("INSERT INTO `t_user` (`name`, `age`) VALUES ( #{name}, #{age})")
public void insertUser1(@Param("name") String name,@Param("age") Integer age);
执行方法存入数据
2.数据源事务管理
@Primary指当前数据源的选择,在两个数据源执行时出现异常,a数据源执行成功,b数据源执行失败。
@Override
@Transactional(transactionManager = "test1TransactionManager")
public void insertUser(String name, Integer age) {
userMapper2.insertUser1(name,age);
int a =0/1;
userMapper1.insertUser1(name,age);
}
@transactionManager 指定某个数据源事务开启,但是却不能同时回滚异常,数据保存jta+atomic数据源事务管理来接却数据源问题