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