HIkariCP为每个Web应用程序创建连接池

时间:2018-12-07 10:27:17

标签: java tomcat jndi hikaricp

我正在尝试使用HikariCP为tomcat创建一个全局连接池,但是无论如何,Hikari都会为每个Web应用程序甚至在重新部署应用程序时创建一个新的Pool。此外,这会导致许多未关闭的连接池。

这是我在Tomcat上的配置:

tomcat / conf / server.xml

<GlobalNamingResources>
    <Resource name="jdbc/Pool" global="jdbc/Pool" auth="Container"
        factory="com.zaxxer.hikari.HikariJNDIFactory"
        type="javax.sql.DataSource"
        singleton="true"
        minimumIdle="5"
        maximumPoolSize="30"
        connectionTimeout="300000"
        dataSourceClassName="oracle.jdbc.pool.OracleDataSource"
        dataSource.implicitCachingEnabled="true"
        dataSource.user="user"
        dataSource.password="pw"
        dataSource.url="url" />
</GlobalNamingResources>

tomcat / conf / context.xml

<ResourceLink name="jdbc/Pool"
        global="jdbc/Pool"
        auth="Container"
        type="javax.sql.DataSource" />

在我的Java代码中,我得到的数据源是这样的:

HikariConfig config = new HikariConfig();
Context initContext = new InitialContext();
DataSource dataSource = (DataSource) 
initContext.lookup("java:comp/env/jdbc/Pool");
config.setDataSource(dataSource);
config.setRegisterMbeans(true);
HikariDataSource ds = new HikariDataSource(config);

我实际上没有收到任何错误或信息,但是在jconsole里面,我可以看到Hikari正在为每个Web应用程序创建连接池。

任何人都知道,这里可能出什么问题了?

谢谢!

1 个答案:

答案 0 :(得分:0)

您需要在工厂定义中定义singleton=true

  

如果您想在所有WAR中共享一个池,从阅读Tomcat文档开始,您需要的是singleton =“ true”属性。

  factory="com.zaxxer.hikari.HikariJNDIFactory"
        singleton="true"