Springには、動的なデータソースルーティングがあります。私の場合、それは同じスキーマ(WR/RO)である
public class RoutingDataSource extends AbstractRoutingDataSource {
@Autowired
private DataSourceConfig dataSourceConfig;
@Override
protected Object determineCurrentLookupKey() {
return DbContextHolder.getDbType();
}
public enum DbType {
MASTER, WRITE, READONLY,
}
その後、カスタム注釈やアスペクト
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ReadOnlyConnection {
}
@Aspect
@Component
@Order(1)
public class ReadOnlyConnectionInterceptor {
Pointcut(value = "execution(public * *(..))")
public void anyPublicMethod() {}
@Around("@annotation(readOnlyConnection)")
public Object proceed(ProceedingJoinPoint proceedingJoinPoint, ReadOnlyConnection readOnlyConnection) throws Throwable {
Object result = null;
try {
DbContextHolder.setDbType(DbType.READONLY);
result = proceedingJoinPoint.proceed();
DbContextHolder.clearDbType();
return result;
} finally {
DbContextHolder.clearDbType();
}
}
}
を必要とする。そして、あなたはタグ@ReadOnlyConnectionをごDBに基づいて行動することができます
@Override
@Transactional(readOnly = true)
@ReadOnlyConnection
public UnitDTO getUnitById(Long id) {
return unitRepository.findOne(id);
}
例はhttps://github.com/afedulov/routing-data-sourceです。
実行時の依存性(つまり、休止状態のシャーディング)を解決する必要があるため、まだ作業中ですが、それを私の作業の基礎として使用しました。
接続パラメータを取得するための最初の 'EntityManager'を注入し、' @ PostConstruct'アノテーションを使用して2番目のデータソースを作成するという解決策が見つかりました。このアプローチの唯一の問題は、パラメータが正しくない場合にアプリケーションを再起動する必要があることです。 –