1. 程式人生 > >springBoot多資料來源配置以及事務控制

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

我在微信訂閱號等你!
這裡寫圖片描述