我在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();
}
}
}
我不能确定这是否对你有帮助,但根据你所说的,我可以想到一种方法——
-
您已经为3个国家配置了3个不同的数据源。
-
您也许可以定义3个独立的Repository类。每个标记为@Repository("india db"(等
-
除了@Transactional,还用@TransactionAdvice("india db"(标记您的方法
-
现在的代码是
if(country.equals("india"){ indiaAppRepository.operation();
}
-
如果所有区域的代码都相同,并且区域设置之间没有冲突,则可以将操作移动到父类或接口默认方法。
可能有更多的方法可以做到这一点。但这就是我使用2个不同数据源的方法。我使用的是Micronaut 2.0和Micronaut data 1.0.2@TransactionAdvice似乎也只适用于方法。当我试着把它添加到课堂上时,它不起作用。拦截器似乎在寻找它,只是在方法上。