2017-08-25 189 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拾取,只有其中一个。 –

相关问题