有一些项目需求需要多个数据源,但是这样的项目直接用事务注解不管用。下面是简单解决方法
@Configuration
public class DataSourceConfig {
/**
* 系统管理用户的数据源
* @return
*/
@Primary
@Bean(name = "mgrDataSource")
@ConfigurationProperties(prefix="spring.datasource.mgr")// application.properteis中对应属性的前缀
public DataSource mgrDataSource() {
return DataSourceBuilder.create().build();
}
/**
* 代码表用户
* @return
*/
@Bean(name = "codeDataSource")
@ConfigurationProperties(prefix="spring.datasource.code")
public DataSource codeDataSource() {
return DataSourceBuilder.create().build();
}
/**
* resource 资源管理
* @return
*/
@Bean(name = "roadworkDataSource")
@ConfigurationProperties(prefix="spring.datasource.roadwork")// application.properteis中对应属性的前缀
public DataSource roadworkDataSource() {
return DataSourceBuilder.create().build();
}
}
}
上面是一个多数据源的基本配置
package main.config;
import javax.sql.DataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
@Configuration
@MapperScan(basePackages = {"roadwork.dao"}, sqlSessionFactoryRef = "roadworkSqlSessionFactory")
public class RoadWorkMapperConfig {
@Autowired
@Qualifier("roadworkDataSource")
private DataSource ds;
@Bean(name="roadworkSqlSessionFactory")
public SqlSessionFactory sqlSessionFactory() throws Exception {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(ds);
factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:roadwork/mappers/**/*Mapper.xml"));
return factoryBean.getObject();
}
}
这是每一个数据源的配置
/**
* post事务支持
* */
@Bean(name = "postTransactionManager")
@Primary
public DataSourceTransactionManager testTransactionManager(@Qualifier("postDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
在多数据源的基本配置里新添加一个需要开启的事务的数据源的配置
@Transactional(value="postTransactionManager")
在需要事务的方法上加入@Transactional(value="postTransactionManager")注解即可