micronaut-data :多个数据源

micronaut-data : multiple data sources

我在 yml 中有多个数据库,如何获取特定国家/地区的存储库?我在运行时获取国家名称,基于国家名称,我需要对该国家数据库进行操作,单个数据库从 yml 获取默认数据库存储库。

根据 micronaut 文档:在多数据源场景中,@io.micronaut.data.annotation.Repository 注释可用于指定要使用的数据源配置。默认情况下,Micronaut Data 将查找默认数据源。

我的查询对所有数据库都保持不变,只有数据库实例在运行时被选中进行操作。

https://micronaut-projects.github.io/micronaut-data/snapshot/guide/index.html

错误:

Caused by: io.micronaut.context.exceptions.NonUniqueBeanException: Multiple possible bean candidates found: [io.micronaut.data.jdbc.operations.DefaultJdbcRepositoryOperations, io.micronaut.data.jdbc.operations.DefaultJdbcRepositoryOperations, io.micronaut.data.jdbc.operations.DefaultJdbcRepositoryOperations]

yml

datasources:
  india-db:
    validationQuery: SELECT 1 FROM DUAL
    driverClass: oracle.jdbc.driver.OracleDriver
    url: url-1
    autoCommit: true
    username: username
    password: password
  australia-db:
    validationQuery: SELECT 1 FROM DUAL
    driverClass: oracle.jdbc.driver.OracleDriver
    url: url-2
    autoCommit: true
    username: password
    password: password
  japan-db:
    validationQuery: SELECT 1 FROM DUAL
    driverClass: oracle.jdbc.driver.OracleDriver
    url: url-3
    autoCommit: true
    username: username
    password: password

存储库

//@Repository(value = "india-db")
@JdbcRepository(dialect = Dialect.ORACLE)
public class AppRepository {

    private final JdbcOperations jdbcOperations;

    @Inject
    public AppRepository(JdbcOperations jdbcOperations) {
        this.jdbcOperations = jdbcOperations;
    }
    
    @Transactional
    public String operation(){
    }
}

服务

@Singleton
public class AppService {
   
    AppRepository appRepository;
   
    @Inject
    public AppService(AppRepository appRepository){
      this.appRepository=appRepository;
    }
    
    public void method(String country){
    if(country.equals("india"){  
       //do india operation with india-db
       appRepository.operation();
    }else if(australia){
      //do australia operation with australia -db
        appRepository.operation();
     }else if(japan){
      //do japan operation with japan-db
       appRepository.operation();
     }
     else{
     throw exception();
     }
    }
}   

我不确定这是否对你有帮助,但根据你所说的,我可以想到一种方法 -

  1. 您已经为 3 个国家/地区配置了 3 个不同的数据源。

  2. 您也许可以定义 3 个单独的存储库 classes。每个标记为 @Repository("india-db") 等

  3. 连同@Transactional 也用@TransactionAdvice("india-db")

    标记你的方法
  4. 现在代码是

    if(country.equals("india"){  
       indiaAppRepository.operation();
    

    }

  5. 如果所有区域的代码都相同,并且区域设置之间没有冲突,则可以将操作移至父 class 或界面默认方法。

可能有更多方法可以做到这一点。但这就是我如何使用 2 个不同的数据源。我正在使用 Micronaut 2.0 和 micronaut-data 1.0.2 @TransactionAdvice 似乎也只适用于方法。当我尝试将它添加到 class 时,它没有用。拦截器好像在找,只在方法上。