为什么 HikariCP 在启动时为 Tomcat 中的每个 Web 应用程序创建新连接

Why HikariCP creates new connection for every web app in Tomcat on startup

当我将 Tomcat 7 的 HikariCP 定义为 context.xml 内部的 JNDI 时,如下所示,每次我部署新的 Web 应用程序时,它都会打开与 mysql 服务器的新连接。例如,如果我在 Tomcat 中有 5 个 App,它将打开 50 个连接,每个 App 10 个。但是,在 C3p0 中,使用相同的设置和相同的 tomcat 实例,它只创建一个具有 10 个连接的池并与所有应用程序共享该池。我的意思是,在 C3P0 中,池不会为每个应用程序打开新连接,而在 HikariCP 中,它会。这样做是有原因的吗?还有什么可以改变的吗?

<Resource name="jdbc/testDatasource" 
      auth="Container" 
      factory="com.zaxxer.hikari.HikariJNDIFactory" 
      type="javax.sql.DataSource" 
      driverClassName="com.mysql.jdbc.Driver"
      jdbcUrl="jdbc:mysql://localhost:3306/football" 
      username="xxx" 
      password="xxx" 
      minimumIdle="3" maximumPoolSize="10" connectionTimeout="300000" maxLifetime="1800000" />

如文档所述,tomcat 为容器中的每个 Web 应用程序加载 context.xml 中的配置。当您有 5 个 Web 应用程序时,HikariCP 将为每个应用程序加载(5 次)。因此,对于 context.xml 文件中配置的任何内容,此行为都是正常的。

如果您希望 HikariCP 只加载一次,而不考虑容器中的应用程序数量,您需要在 server.xml 文件而不是 context.xml 中定义 HikariCP JNDI。如下所示:

server.xml中定义HikariCP JNDI:

<GlobalNamingResources>
      <Resource name="jdbc/testDatasource" 
      auth="Container" 
      factory="com.zaxxer.hikari.HikariJNDIFactory" 
      type="javax.sql.DataSource" 
      driverClassName="com.mysql.jdbc.Driver"
      jdbcUrl="jdbc:mysql://localhost:3306/football" 
      username="xxx" 
      password="xxx" 
      minimumIdle="3" maximumPoolSize="10" connectionTimeout="300000" maxLifetime="1800000" />
</GlobalNamingResources>

引用context.xml中的JNDI资源:

<Context>
   <ResourceLink name="jdbc/testDatasource"
            global="jdbc/testDatasource"
            type="javax.sql.DataSource" />
</Context>

注意:每次要重新加载 HikariCP 设置时,使用此设置都需要重新启动 Web 服务器。重新部署应用程序将不再导致重新加载 HikariCP。