我有一个Spring Boot应用程序,可以连接到两个单独的数据库。一切 正常(我遵循了文档 和教程中的步骤),尽管为了 自定义Tomcat JDBC连接池设置,我必须手动 配置它(由于 定义了多个数据源,因此忽略了Boot自动配置,并且 Spring Boot不再从 application.properties中读取特定于tomcat的属性)。
在两个数据源的配置过程中使用调试器时,我看到 两个 org.apache.tomcat.jdbc.pool.DataSource 实例在 DataSource.PoolProperties [“ name”]条目中具有相同的连接池。请参见 调试器中的以下屏幕截图,每个dataSource()方法都在单独的配置 类中进行配置。请注意,定义了相同的连接池。主数据源CP配置 辅助数据源CP配置
但是,从我使用jConsole + tomcatJMX看到的结果来看,只有一个连接池,其中配置了主要数据库详细信息(URL,凭据,请参见下文)。jConsole检查有关连接池的Tomcat JDBC JMX信息
由于Spring内部有多个抽象层,因此 我很难调试它。我有Eclipse Class Decompiler 插件, 通常用它来查看Spring逻辑,但是在这种情况下, 数据源的初始化代码在 注册bean时发生,而不是在Spring Boot实际使用它们设置数据时发生 来源。
最重要的是,您能帮我了解一下吗:
为什么只有一个连接池 如何使用两个连接池,每个数据源一个 在Spring代码中的何处查看其工作原理的更多详细信息
我正在回答当时的情况。如果您找到更好的解决方案,或者 Spring允许多个连接池,请发布答案,我会 选择您的答案。
考虑到我在问题中发布的代码,由于Spring将仅配置 一个连接池( 在tomcat CP上设置了validationQuery和validationInterval),因此我添加了一个计划方法来使 第二个数据源保持活动状态。
@Scheduled(fixedRate=INTERVAL_IN_MS) public void scheduledTestDatabaseConnection() { try { testDatabaseConnection(); LOGGER.trace("Tested EJBCA DB connection with success"); } catch (Exception e) { LOGGER.error("Got an error when refreshing the EJBCA DB connection '{}'", e.getMessage()); } }
在上面的示例中,testDatabaseConnection()在SpringData Repository 上调用一个方法
@Query("SELECT 1 FROM MyTable") public int testConnection();