2017-08-25 191 views
4

我有一個Spring Boot應用程序連接到兩個單獨的數據庫。雖然爲了自定義Tomcat JDBC連接池設置I had to manually configure it(因爲通過定義多個數據源,Boot自動配置被忽略,並且Spring Boot不會讀取),所有工作正常(我遵循the docsa tutorial中的步驟)來自application.properties的tomcat特定屬性)。如何在Spring Boot中使用多個數據源時設置多個連接池?

當我兩個數據源的配置過程中使用調試器,我看到兩個org.apache.tomcat.jdbc.pool.DataSource實例都在DataSource.PoolProperties [「名稱」]條目相同的連接池。 在調試器中查看下面的截圖,每個dataSource()方法都在單獨的配置類中進行配置。請注意,定義了相同的連接池。 Primary DataSource CP configuration Secondary DataSource CP configuration

然而,從我看到使用JConsole + tomcat的JMX什麼,只有一個連接池,其中有主數據庫配置的詳細信息(URL,證書,見下文)。 jConsole inspecting the Tomcat JDBC JMX info about the Connection Pool

由於Spring內部有多層抽象,所以我很難調試它。我有Eclipse Class Decompiler plugin,我通常使用它來查看Spring邏輯,但在這種情況下,數據源的初始化代碼在Bean註冊時發生,而不是在Spring Boot實際使用它們設置數據源時發生。

底線是,你能不能幫我明白了:

  1. 爲什麼只有一個連接池
  2. 我如何使用兩個連接池,一個用於每個數據源
  3. ,其中在春節代碼看看更多細節如何工作

對於第二個問題,有一個related question,但沒有答案。有another question這是一個誤報,而another one這是關於春天,而不是春季啓動,所以請不要報告這個愚蠢。

+0

詳細信息您可以附上數據源創建方法的完整來源是什麼?圖片被裁剪邊緣。 – user3007501

回答

1
  1. 一般來說,DataSource接口由集中庫與框架和JavaEE的代碼,這實際上與DB驅動程序的通用JDBC連接源兼容的實現。
    SpringBoot自動配置具有流行池庫的DataSource初始值設定項。完整列表你可以在Spring sources找到。
    這意味着您需要在項目中利用池的所有功能都是添加像Hikari這樣的池化庫作爲依賴關係,並配置參數spring.datasource.*。 Spring將創建並配置單個合併DataSource可以在代碼中自動裝配。
  2. 另一個故事,如果你需要創建多個DataSource。 SpringBoot自動配置大量使用@ConditionalOnMissingBean註釋來確定可以應用默認行爲的情況。 Spring不能創建兩個默認數據源,因爲它不明確應該使用哪一個。
    你可以在spring-boot-autoconfugire模塊中找到它:Spring只有在上下文中沒有這種類型的bean時才啓動DataSource初始化邏輯。
    要使用多個池,您必須爲每個池池連接定義自己的Bean。 Spring會注意到你的DataSource,並且不會在內部創建池。這是一個example
  3. 你可以找到更多關於DataSource自動配置here
+0

謝謝你,並且對於遲到的回覆感到抱歉。在上面的例子中,我創建了兩個不同的DataSource,但它們並沒有被Spring拾取,只有其中一個。 –

相關問題