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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013628152/article/details/82742356

一:多数据源配置

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 })

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

猜你喜欢

转载自blog.csdn.net/u013628152/article/details/82742356
今日推荐