一尘不染

在Spring Boot中使用多个数据源时,如何设置多个连接池?

tomcat

我有一个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代码中的何处查看其工作原理的更多详细信息


阅读 809

收藏
2020-06-16

共1个答案

一尘不染

我正在回答当时的情况。如果您找到更好的解决方案,或者
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();
2020-06-16