2016-11-28 45 views
0

我有一個springboot應用程序,它有自己的數據源(讓我們稱爲DB1)設置屬性工作正常。如何使用SpringBoot創建動態數據源

但是,此應用程序需要使用用戶之前通知並存儲在DB1中的一些參數來配置數據源(DB2)的新數據源

我的想法是創建一個命名bean,因此我的應用程序的特定部分可以用來訪問DB2表。我認爲可以通過重新啓動應用程序來做到這一點,但我想避免它。

此外,我需要我的代碼的一部分使用新的數據源(彈簧數據jpa,映射,等等)。我不知道這個問題,但它是一個Web應用程序,所以我不能僅爲請求線程創建數據源。

你能幫我嗎?

在此先感謝。

+0

我找到了一個注入第一個'EntityManager'來獲取連接參數並使用'@ PostConstruct'註解來創建第二個數據源的解決方案。這種方法唯一的問題是如果參數不正確,我需要重新啓動應用程序。 –

回答

1

如果這是你的目標,那麼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)。

+0

請不要提供僅供鏈接的答案,鏈接可能會被打破,答案將變得無關緊要。把最重要的位直接放到你的文章中。 – YakovL

+0

同意。添加了完整源代碼鏈接的示例行爲 – Oberst

相關問題