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