spring boot多數據源下的事務配置

1、啓動項目排除自動注入數據源

   

@SpringBootApplication(exclude = { DruidDataSourceAutoConfigure.class})

2、配置數據源中添加事務配置

  

@Bean(name = "mysqlV2Tx")
public DataSourceTransactionManager transactionManager(@Qualifier("mysqlV2DataSource") DataSource dataSource) {
      return new DataSourceTransactionManager(dataSource);
}
package com.fun.cim.con.config;


@Configuration
@MapperScan(basePackages = { "com.fun.cim.con.mapper.v2"}, sqlSessionFactoryRef = "mysqlV2SqlSessionFactory")
public class MySqlV2DruidConfig {

	private static final Logger LOGGER = LoggerFactory.getLogger(MySqlV2DruidConfig.class);

	@Value("${spring.datasource.v2.url}")
	private String dbUrl;

	@Value("${spring.datasource.v2.username}")
	private String username;

	@Value("${spring.datasource.v2.password}")
	private String password;

	@Value("${spring.datasource.v2.driver-class-name}")
	private String driverClassName;

	@Value("${spring.datasource.initialSize}")
	private int initialSize;

	@Value("${spring.datasource.minIdle}")
	private int minIdle;

	@Value("${spring.datasource.maxActive}")
	private int maxActive;

	@Value("${spring.datasource.maxWait}")
	private int maxWait;

	@Value("${spring.datasource.timeBetweenEvictionRunsMillis}")
	private int timeBetweenEvictionRunsMillis;

	@Value("${spring.datasource.minEvictableIdleTimeMillis}")
	private int minEvictableIdleTimeMillis;

	@Value("${spring.datasource.validationQuery}")
	private String validationQuery;

	@Value("${spring.datasource.testWhileIdle}")
	private boolean testWhileIdle;

	@Value("${spring.datasource.testOnBorrow}")
	private boolean testOnBorrow;

	@Value("${spring.datasource.testOnReturn}")
	private boolean testOnReturn;

	@Value("${spring.datasource.poolPreparedStatements}")
	private boolean poolPreparedStatements;

	@Value("${spring.datasource.maxPoolPreparedStatementPerConnectionSize}")
	private int maxPoolPreparedStatementPerConnectionSize;

	@Value("${spring.datasource.v2.filters}")
	private String filters;

	@Value("{spring.datasource.connectionProperties}")
	private String connectionProperties;

	@Bean(name = "mysqlV2DataSource")
	public DataSource mysqlV2DataSource() {
		DruidDataSource datasource = new DruidDataSource();
		datasource.setUrl(dbUrl);
		datasource.setUsername(username);
		datasource.setPassword(password);
		datasource.setDriverClassName(driverClassName);
		datasource.setInitialSize(initialSize);
		datasource.setMinIdle(minIdle);
		datasource.setMaxActive(maxActive);
		datasource.setMaxWait(maxWait);
		datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
		datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
		datasource.setValidationQuery(validationQuery);
		datasource.setTestWhileIdle(testWhileIdle);
		datasource.setTestOnBorrow(testOnBorrow);
		datasource.setTestOnReturn(testOnReturn);
		datasource.setPoolPreparedStatements(poolPreparedStatements);
		datasource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);
		datasource.setConnectionProperties(connectionProperties);
		return datasource;
	}

	@Bean(name = "mysqlV2SqlSessionFactory")
	public SqlSessionFactory mysqlV2SqlSessionFactory(@Qualifier("mysqlV2DataSource") DataSource dataSource) {
		MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();
		bean.setDataSource(dataSource);
		ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
		try {
			List<Resource> mapperLocations = new ArrayList<Resource>();
			mapperLocations.addAll(Arrays.asList(resolver.getResources("classpath:mybatis/mapper/v2/*.xml")));
			
			bean.setConfigLocation(resolver.getResource("classpath:mybatis/mybatis-config.xml"));
			bean.setMapperLocations(mapperLocations.toArray(new Resource[0]));
			// 手動設置session工廠時,需要手動添加分頁插件
			List<Interceptor> plugins = new ArrayList<Interceptor>();
			plugins.add(paginationInterceptor());
			bean.setPlugins(plugins.toArray(new Interceptor[0]));
			return bean.getObject();
		} catch (Exception e) {
			LOGGER.error(MessageFormat.format("構建mysql SessionFactory 出錯 :{0}", e.getMessage()));
			throw new RuntimeException(e);
		}
	}

	@Bean
	public SqlSessionTemplate mysqlV2SqlSessionTemplate(@Qualifier("mysqlV2SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
		// 使用上面配置的Factory
		SqlSessionTemplate template = new SqlSessionTemplate(sqlSessionFactory);
		return template;
	}

    //事務配置
	@Bean(name = "mysqlV2Tx")
	public DataSourceTransactionManager transactionManager(@Qualifier("mysqlV2DataSource") DataSource dataSource) {
			return new DataSourceTransactionManager(dataSource);
	}

	@Bean(name = "mysqlV2DruidServlet")
	public ServletRegistrationBean druidServlet() {
		ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
		// 設置登錄查看信息的賬號密碼.
		servletRegistrationBean.addInitParameter("loginUsername", "admin1");
		servletRegistrationBean.addInitParameter("loginPassword", "admin1");
		return servletRegistrationBean;
	}

	@Bean(name = "mysqlV2filterRegistrationBean")
	public FilterRegistrationBean filterRegistrationBean() {
		FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
		filterRegistrationBean.setFilter(new WebStatFilter());
		filterRegistrationBean.addUrlPatterns("/*");
		filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
		return filterRegistrationBean;
	}

	/**
	* 分頁插件mybatis-plus配置使用
	 */
	@Bean
	public PaginationInterceptor paginationInterceptor() {
		return new PaginationInterceptor();
	}

}

3、添加@transactional註解

@Transactional(value = "mysqlV2Tx",rollbackFor = Exception.class)

以上方法僅適用於多數據源單獨使用。多數據源混合使用需要採用分佈式事務

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章