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)
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。