目前,我正在使用SpringBoot2.5和MyBatis安装程序,并使用多个数据源。
我希望在映射器接口中使用一个名为@ReadReplica
的自定义方法级注释,并让MyBatis切换到我的第二个数据源(readReplicaDataSource
)。
就像这样:
@Mapper
public interface MyMapper {
@ReadReplica // uses readReplicaDataSource
List<MyData> selectAll();
int insert(MyData record); // uses primaryDataSource
}
这个是可能的吗?
application.yaml
spring:
datasource:
driver-class-name: org.postgresql.Driver
password: ${DB_PSWD}
username: ${DB_USER}
jdbc-url: ${DB_URL}
datasource-read-replica:
driver-class-name: org.postgresql.Driver
password: ${DB_PSWD}
username: ${DB_USER}
jdbc-url: ${DB_READ_REPLICA_URL}
mybatis:
mapper-locations: mapper/*.xml
build.gradle
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.1.4'
implementation 'org.mybatis.dynamic-sql:mybatis-dynamic-sql:1.3.0'
PrimaryMyBatisConfig.java
@Configuration
@Slf4j
public class PrimaryMyBatisConfig {
@Value("${mybatis.mapper-locations}")
private String mapperLocations;
@Primary
@Bean(name="primaryDataSource")
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
SqlSessionFactory primarySqlSessionFactory(DataSource dataSource) {
SqlSessionFactory sessionFactory = null;
try {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
bean.setMapperLocations((new PathMatchingResourcePatternResolver().getResources(ResourceLoader.CLASSPATH_URL_PREFIX + mapperLocations)));
sessionFactory = bean.getObject();
} catch (Exception e) {
log.error("Error establishing primary SQL session factory {}", e);
}
return sessionFactory;
}
@Bean
@Primary
SqlSessionTemplate primarySqlSessionTemplate(@Qualifier("primaryDataSource") DataSource dataSource) {
return new SqlSessionTemplate(primarySqlSessionFactory(dataSource));
}
@Bean
@Primary
public DataSourceTransactionManager primaryTransactionManager(@Qualifier("primaryDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}
ReadReplicaMyBatisConfig.java
@Configuration
@Slf4j
public class ReadReplicaMyBatisConfig {
@Value("${mybatis.mapper-locations}")
private String mapperLocations;
@Bean(name="readReplicaDataSource")
@ConfigurationProperties(prefix = "spring.datasource-read-replica")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
SqlSessionFactory readReplicaSqlSessionFactory(DataSource dataSource) {
SqlSessionFactory sessionFactory = null;
try {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
bean.setMapperLocations((new PathMatchingResourcePatternResolver().getResources(ResourceLoader.CLASSPATH_URL_PREFIX + mapperLocations)));
sessionFactory = bean.getObject();
} catch (Exception e) {
log.error("Error establishing read replica SQL session factory {}", e);
}
return sessionFactory;
}
@Bean
SqlSessionTemplate readReplicaSqlSessionTemplate(@Qualifier("readReplicaDataSource") DataSource dataSource) {
return new SqlSessionTemplate(readReplicaSqlSessionFactory(dataSource));
}
@Bean
public DataSourceTransactionManager readReplicaTransactionManager(@Qualifier("readReplicaDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}
ReadReplica.java
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface ReadReplica {}
发布于 2021-11-06 10:57:47
您应该能够通过配置自定义@MapperScan
注释来实现这一点。下面是一个示例,将不同包中的映射程序连接到不同的模板。连接到不同数据源的概念类似:https://github.com/jeffgbutler/mybatis-cockroach-demo/blob/master/src/main/java/com/example/cockroachdemo/MyBatisConfiguration.java
https://stackoverflow.com/questions/69840857
复制相似问题