如果這是你的目標,那麼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。
我用它作爲我工作的基礎,雖然它仍在進行中,因爲我仍然需要解析運行時依賴關係(即hibernate sharding)。
我找到了一個注入第一個'EntityManager'來獲取連接參數並使用'@ PostConstruct'註解來創建第二個數據源的解決方案。這種方法唯一的問題是如果參數不正確,我需要重新啓動應用程序。 –