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

man*_*cks 3 mysql c3p0 tomcat7 hikaricp

当我将 Tomcat 7 的 HikariCP 定义为 context.xml 中的 JNDI 时,如下所示,每次部署新的 Web 应用程序时,它都会打开与 mysql 服务器的新连接。例如,如果我在 Tomcat 中有 5 个应用程序,它将打开 50 个连接,每个应用程序 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" />
Run Code Online (Sandbox Code Playgroud)

Abo*_*odz 5

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

如果您希望 HikariCP 仅加载一次并且无论容器中的应用程序数量如何,您需要在server.xml文件 not中定义 HikariCP JNDI context.xml。情况如下:

在以下位置定义 HikariCP JNDI server.xml

<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>
Run Code Online (Sandbox Code Playgroud)

参考 JNDI 资源context.xml

<Context>
   <ResourceLink name="jdbc/testDatasource"
            global="jdbc/testDatasource"
            type="javax.sql.DataSource" />
</Context>
Run Code Online (Sandbox Code Playgroud)

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