数据库读写分离-springboot事务配置篇

本文介绍了如何在SpringBoot项目中实现数据库读写分离的事务配置,详细讲解了DataSourceConfiguration、ReadWriteDataSource、ReadWriteDataSourceDecision、ReadWriteDataSourceProcessor和TxAdviceInterceptor的使用,并提供了配置文件的约定和示例,帮助读者理解和应用读写分离技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

spring事务配置见:https://blog.csdn.net/andyzhaojianhui/article/details/74357100?locationNum=9&fps=1

根据这篇文章做了一些修改以适用于springboot项目,可能还有一些未知问题,目前使用中尚未发现,欢迎指正,不胜感激

注意:我们约定

配置文件中的写库的连接信息spring.datasource开头,例如spring.datasource.url=

spring.read.datasource.name这项来确定有多少个读库,多个读库以英文逗号分隔

例如spring.read.datasource.name=read1,read2

读库连接信息以spring. + 上面的name对应的读库名 + .datasource开头,

例如

spring.read1.datasource.url=

spring.read2.datasource.url=

1.DataSourceConfiguration,实例化数据源,事务管理等

import com.github.pagehelper.PageInterceptor;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.tomcat.jdbc.pool.PoolProperties;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.core.env.Environment;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.interceptor.TransactionInterceptor;
import org.springframework.util.StringUtils;

import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

/**
 * 初始化数据源、事务管理器等
 */
@Configuration
public class DataSourceConfiguration {

    @Autowired
    private Environment env;

    @Bean
    public DataSource dataSource() {
        ReadWriteDataSource dataSource = new ReadWriteDataSource();
        dataSource.setWriteDataSource(writeDataSource());
        dataSource.setReadDataSourceMap(readDataSourceMap());
        return dataSource;
    }

    @Autowired
    private TransactionInterceptor txAdvice;

    @Bean
    public ReadWriteDataSourceProcessor readWriteDataSourceTransactionProcessor() {
        ReadWriteDataSourceProcessor processor = new ReadWriteDataSourceProcessor();
        processor.setForceChoiceReadWhenWrite(true);
        processor.postProcessAfterInitialization(txAdvice.getTransactionAttributeSource(), null);
        return processor;
    }

	//初始化写数据源
    public DataSource writeDataSource() {
        PoolProperties properties = new PoolProperties();
        properties.setUrl(env.getProperty("spring.datasource.url"));
        properties.setUsername(env.getProperty("spring.datasource.username"));
        properties.setPassword(env.getProperty("spring.datasource.password"));
        properties.setDriverClassName(env.getProperty("spring.datasource.jdbc.driver"));
        properties.setInitialSize(Integer.valueOf(env.getProperty("spring.datasource.tomcat.initial-size")));
        properties.setMinIdle(Integer.valueOf(env.getProperty("spring.datasource.tomcat.min-idle")));
        properties.setMaxActive(Integer.valueOf(env.getProperty("spring.datasource.tomcat.max-active")));
        properties.setMaxIdle(Integer.valueOf(env.getProperty("spring.datasource.tomcat.max-idle")));
        properties.setMaxWait(Integer.valueOf(env.getProperty("spring.datasource.tomcat.max-wait")));
        properties.setValidationQuery(env.getProperty("spring.datasource.tomcat.validation-query"));
        properties.setTestWhileIdle(Boolean.valueOf(env.getProperty("spring.datasource.tomcat.test-while-idle")));
        properties.setTimeBetweenEvictionRunsMillis(Integer.valueOf(env.getProperty("spring.datasource.tomcat.time-between-eviction-runs-millis")));
        org.apache.tomcat.jdbc.pool.DataSource dataSource = new org.apache.tomcat.jdbc.pool.DataSource(properties);
        return dataSource;
    }

	
	//初始化读数据源,这里可以看出为什么上面要进行那样的约定
    public Map<String, DataSource> readDataSourceMap() {
        String readCount = env.getProperty("spring.read.datasource.name");
        if (!StringUtils.isEmpty(readCount)) {
            String[] split = readCount.split(",");
            if (split.length > 0) {
                Map<String, DataSource> dMap = new HashMap<>(split.le
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值