micronaut数据:多个数据源



我在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个独立的Repository类。每个标记为@Repository("india db"(等

  3. 除了@Transactional,还用@TransactionAdvice("india db"(标记您的方法

  4. 现在的代码是

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

    }

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

可能有更多的方法可以做到这一点。但这就是我使用2个不同数据源的方法。我使用的是Micronaut 2.0和Micronaut data 1.0.2@TransactionAdvice似乎也只适用于方法。当我试着把它添加到课堂上时,它不起作用。拦截器似乎在寻找它,只是在方法上。

最新更新