springBoot多数据源配置以及事务控制

一:多数据源配置

1、主数据源配置文件

package com.bert.datasource;

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.autoconfigure.jdbc.DataSourceBuilder;
import org.springframework.boot.context.properties.ConfigurationProperties;
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 com.github.pagehelper.PageInterceptor;

import java.util.Properties;

import javax.sql.DataSource;

@Configuration
@MapperScan(basePackages = "com.bert.mapper.master1", sqlSessionTemplateRef = "master1SqlSessionTemplate")
public class DataSource1Config {

	@Bean(name = "master1DataSource")
	@ConfigurationProperties(prefix = "master1.datasource")
	@Primary
	public DataSource master1DataSource() {
		return DataSourceBuilder.create().build();
	}

	@Bean(name = "master1SqlSessionFactory")
	@Primary
	public SqlSessionFactory master1SqlSessionFactory(@Qualifier("master1DataSource") DataSource dataSource)
			throws Exception {
		SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
		bean.setDataSource(dataSource);
		bean.setMapperLocations(
				new PathMatchingResourcePatternResolver().getResources("classpath:mapper/master1/*.xml"));

		// 分页拦截器-begin
		PageInterceptor pageHelper = new PageInterceptor();
		Properties properties = new Properties();
		properties.setProperty("helperDialect", "com.github.pagehelper.dialect.helper.SqlServerDialect");
		properties.setProperty("offsetAsPageNum", "true");
		properties.setProperty("rowBoundsWithCount", "false");
		properties.setProperty("reasonable", "false");
		pageHelper.setProperties(properties);
		bean.getObject().getConfiguration().addInterceptor(pageHelper);

		return bean.getObject();
	}

	@Bean(name = "master1TransactionManager")
	@Primary
	public DataSourceTransactionManager master1TransactionManager(@Qualifier("master1DataSource") DataSource dataSource) {
		return new DataSourceTransactionManager(dataSource);
	}

	@Bean(name = "master1SqlSessionTemplate")
	@Primary
	public SqlSessionTemplate master1SqlSessionTemplate(
			@Qualifier("master1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
		return new SqlSessionTemplate(sqlSessionFactory);
	}

}

2、其他数据源配置文件

package com.bert.datasource;

import java.util.Properties;

import javax.sql.DataSource;

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.autoconfigure.jdbc.DataSourceBuilder;
import org.springframework.boot.context.properties.ConfigurationProperties;
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 com.github.pagehelper.PageInterceptor;

@Configuration
@MapperScan(basePackages = "com.bert.mapper.master2", sqlSessionTemplateRef = "master2SqlSessionTemplate")
public class DataSource2Config {

	@Bean(name = "master2DataSource")
	@ConfigurationProperties(prefix = "master2.datasource")
	public DataSource master2DataSource() {
		return DataSourceBuilder.create().build();
	}

	@Bean(name = "master2SqlSessionFactory")
	public SqlSessionFactory master2SqlSessionFactory(@Qualifier("master2DataSource") DataSource dataSource)
			throws Exception {
		SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
		bean.setDataSource(dataSource);
		bean.setMapperLocations(
				new PathMatchingResourcePatternResolver().getResources("classpath:mapper/master2/*.xml"));

		// 分页拦截器-begin
		PageInterceptor pageHelper = new PageInterceptor();
		Properties properties = new Properties();
		properties.setProperty("helperDialect", "com.github.pagehelper.dialect.helper.SqlServerDialect");
		properties.setProperty("offsetAsPageNum", "true");
		properties.setProperty("rowBoundsWithCount", "false");
		properties.setProperty("reasonable", "false");
		pageHelper.setProperties(properties);
		bean.getObject().getConfiguration().addInterceptor(pageHelper);

		return bean.getObject();
	}

	@Bean(name = "master2TransactionManager")
	public DataSourceTransactionManager master2TransactionManager(@Qualifier("master2DataSource") DataSource dataSource) {
		return new DataSourceTransactionManager(dataSource);
	}

	@Bean(name = "master2SqlSessionTemplate")
	public SqlSessionTemplate master2SqlSessionTemplate(
			@Qualifier("master2SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
		return new SqlSessionTemplate(sqlSessionFactory);
	}

}

注意:
A:只能有一个主数据源,用注解@Primary表示
B:@MapperScan属性basePackages,表示数据源对应的mapper文件目录

3、springBoot配置文件

master1.datasource.url=jdbc:sqlserver://ip1:1433; DatabaseName=db1
master1.datasource.username=xx
master1.datasource.password=xxxxxx
master1.datasource.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver



master2.datasource.url=jdbc:sqlserver://ip2:1433; DatabaseName=db2
master2.datasource.username=xx
master3.datasource.password=xxxxxx
master2.datasource.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver


二:多数据源事务控制

1、启动文件,配置事务注解@EnableTransactionManagement

@Controller
@SpringBootApplication
@EnableSwagger2
@EnableTransactionManagement
public class BootMain extends SpringBootServletInitializer{

	@Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(BootMain.class);
    }
	
	public static void main(String[] args) {
		SpringApplication.run(BootMain.class, args);
	}

}

2、接口实现配置事务注解@Transactional

如果是单一数据源,只需要在service实现的方法上加上@Transactional即可。
如果是多数据源,需要指定事务管理器名称

@Transactional(value = "master2TransactionManager", rollbackFor = { Exception.class })

我在微信订阅号等你!
这里写图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十五楼亮哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值