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

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

当我使用Tomcat 7在context.xml中将HikariCP定义为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" />

如文档所述,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>
   <ResourceLink name="jdbc/testDatasource"
            global="jdbc/testDatasource"
            type="javax.sql.DataSource" />
</Context>

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

干得好!传授知识。