使用 Seata 代理数据源 DataSource
使用 Seata 代理数据源 DataSource【io.seata.rm.datasource】
1. 代码【我们的数据源最终是给 sqlSessionFactory 使用的】
package com.llq.springcloud.config;
@Configuration
public class DataSourceProxyConfig {
@Value("${mybatis.mapperLocations}") // 引用 application.yml 中的配置
private String mapperLocations;
// 配置 druidDataSource
@Bean // 注入容器中
@ConfigurationProperties(prefix = "spring.datasource") // 引用 application.yml 中的配置
public DataSource druidDataSource(){
return new DruidDataSource();
}
// 配置 DataSourceProxy【用 Seata 代理数据源】===> 我们的数据源最终是给 sqlSessionFactory 使用的
@Bean
public DataSourceProxy dataSourceProxy(DataSource dataSource){
return new DataSourceProxy(dataSource);
}
// 配置 SqlSessionFactory - 常规写法
@Bean
public SqlSessionFactory sqlSessionFactoryBean(DataSourceProxy dataSourceProxy)
throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean =
new SqlSessionFactoryBean(); // 创建好 sqlSessionFactoryBean,在下面设置它
sqlSessionFactoryBean.setDataSource(dataSourceProxy);
sqlSessionFactoryBean.setMapperLocations
(new PathMatchingResourcePatternResolver().getResources(mapperLocations));
sqlSessionFactoryBean.setTransactionFactory
(new SpringManagedTransactionFactory()); // 设置事务管理器
return sqlSessionFactoryBean.getObject();
}
}
2. 逻辑证明【SqlSessionFacotory:连接池,SqlSession:连接】
它们是否是同一个对象【利用 HashCode 来验证】