【问题标题】:Hibernate - C3P0 JDBC connection poolingHibernate - C3P0 JDBC 连接池
【发布时间】:2022-08-09 18:25:04
【问题描述】:

我不是 Java 开发人员,而是系统管理员,所以请原谅我的任何毫无意义的陈述或问题。

我怀疑在 Hibernate 中没有正确设置 C3P0 连接池,导致通过各种 Java 应用程序产生大量 Oracle DB 连接 (oracle<instanceID> (LOCAL-NO))。其中一些连接会保持 30 天(可能是陈旧的),直到它们被自动关闭或丢弃。这些连接进入“睡眠(S)”状态,进程堆栈在“sk_wait_data”阶段显示它们。他们中的大多数似乎确实在尝试寻找数据并返回“sk_wait_data”。切换每隔几秒钟发生一次。该开关使进程进入 CPU 运行队列,从而导致系统负载值增加。我相信这是一个非常关键的系统资源问题。

根据 JMC,最小池大小为 1,最大值取决于应用程序的类型。我怀疑min=1 完全错误,应该根据应用程序流量的可持续性和一些可扩展性缓冲区正确设置最大值。在 JMC 中,C3P0 池的使用似乎不稳定且效率低下。

所以连接状态的切换是不好的,需要修复。除了向上面的专家寻求 cmets,我还有一个关于数据库连接的问题:

JDBC 连接会像上面那样来回移动“sk_wait_data”还是错误?

我认为最小大小的池连接将始终连接到数据库,但不知道它们的套接字连接状态是什么?

同样在具有 2 个 Java 应用程序的 VM 上,它们似乎创建了 10 个池。也不确定这是否正确。

请指教。

  • 嗯...没有人必须处理这些问题?有趣的..

标签: hibernate jdbc c3p0 oracle18c


【解决方案1】:

1-”连接保持 30 天“:

放 : maxConnectionAge 为合理值:我通常将其设置为 18000 秒(5 小时),这将确保在此时间之后无论如何都会刷新连接。

2-“他们中的大多数似乎确实在尝试寻找数据并返回“sk_wait_data”

我建议这很可能是驱动程序特定的行为 环境: idleConnectionTestPeriod,我通常设置为 60 秒,这将执行一个 每 60 秒对空闲连接进行一次测试查询。

3-“我怀疑 min=1 是完全错误的”

这个值是根据很多因素决定的,比如连接到数据库的应用程序的数量、持续的活动负载和平均负载,最重要的是并发负载。

我建议根据每秒平均并发负载进行设置。

4-“JDBC 连接会像上面那样来回移动“sk_wait_data”还是错了?”

检查点 1 和点 2,此外,c3p0 提供了“testConnectionOnCheckout”和“testConnectionOnCheckin”属性,这也确保了连接是有效的。

5-“我认为最小大小的池连接将始终连接到数据库,但不知道它们的套接字连接状态是什么?”

这纯粹基于驱动程序的实现,但是,对于第 4 点,您很可能不需要关心它。

6-“VM 有 2 个 Java 应用程序,它们似乎创建了 10 个池。也不确定这是否正确。”

连接池是每个休眠会话工厂创建的(在休眠的情况下),这很可能是每个应用程序(桌面应用程序上的每个 JVM)和 Web 应用程序级别的 Web 服务器(例如 tomcat)或应用程序服务器(例如Weblogic 或 Web 领域)。 但是,如果应用程序创建了多个池,您应该与应用程序开发人员核实。

c3p0 的完整配置可以在以下位置找到:https://www.mchange.com/projects/c3p0/index.html#configuration_properties

祝你好运
贾拉勒

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    • 2012-07-06
    • 2017-10-16
    • 1970-01-01
    • 2010-11-25
    • 1970-01-01
    相关资源
    最近更新 更多