当我将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" />
答案 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。