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

时间:2016-01-14 08:03:54

标签: mysql tomcat7 c3p0 hikaricp

当我将Tomcat 7中的HikariCP定义为如下所示的context.xml中的JNDI时,每次部署新的Web应用程序时,它都会打开与mysql服务器的新连接。例如,如果我在Tomcat中有5个应用程序,它将打开50个连接,每个应用程序10个。但是,在C3p0中,使用相同的设置和相同的tomcat实例,它只创建一个包含10个连接的池,并与所有应用程序共享此池。我的意思是,在C3P0中,池没有为每个APP打开新连接,而在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" />

1 个答案:

答案 0 :(得分:3)

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

如果您希望HikariCP只加载一次,而不管容器中的应用程序数量是多少,您需要在server.xml文件中定义HikariCP JNDI而不是context.xml。这就像下面这样:

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。