首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用两个数据源时在SqlSessionTemplate中切换MyBatis的自定义注释

使用两个数据源时在SqlSessionTemplate中切换MyBatis的自定义注释
EN

Stack Overflow用户
提问于 2021-11-04 14:28:41
回答 1查看 364关注 0票数 0

目前,我正在使用SpringBoot2.5和MyBatis安装程序,并使用多个数据源。

我希望在映射器接口中使用一个名为@ReadReplica的自定义方法级注释,并让MyBatis切换到我的第二个数据源(readReplicaDataSource)。

就像这样:

代码语言:javascript
运行
复制
@Mapper
public interface MyMapper {

    @ReadReplica // uses readReplicaDataSource
    List<MyData> selectAll();

    int insert(MyData record); // uses primaryDataSource
}

这个是可能的吗?

application.yaml

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
@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

代码语言:javascript
运行
复制
@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

代码语言:javascript
运行
复制
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface ReadReplica {}
EN

回答 1

Stack Overflow用户

发布于 2021-11-06 10:57:47

您应该能够通过配置自定义@MapperScan注释来实现这一点。下面是一个示例,将不同包中的映射程序连接到不同的模板。连接到不同数据源的概念类似:https://github.com/jeffgbutler/mybatis-cockroach-demo/blob/master/src/main/java/com/example/cockroachdemo/MyBatisConfiguration.java

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69840857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档