【问题标题】:HIkariCP creates connection pool for every webappHIkariCP 为每个 webapp 创建连接池
【发布时间】:2019-05-09 02:36:53
【问题描述】:

我正在尝试使用 HikariCP 为 tomcat 创建一个全局连接池,但不知何故,Hikari 为每个 web 应用程序甚至在重新部署应用程序时创建了新池。此外,这会导致许多未关闭的连接池。

这是我在 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 应用程序创建连接池。

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

提前致谢!

【问题讨论】:

    标签: java tomcat jndi hikaricp


    【解决方案1】:

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

    如果您想跨 WAR 共享一个池,根据我对 Tomcat 文档的阅读,您需要的是 singleton="true" 属性。

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

    【讨论】:

    • 感谢您的回答,但这也不起作用。您还有其他建议吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-24
    • 2017-09-16
    • 2015-12-15
    • 2015-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多