繁体   English   中英

Hibernate - C3P0 JDBC 连接池

[英]Hibernate - C3P0 JDBC connection pooling

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

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

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

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

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

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

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

请指教。

1-“连接停留 30 天”:

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

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

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

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

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

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

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

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

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

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

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

连接池是根据 hibernate SessionFactory(在休眠的情况下)创建的,这很可能是每个应用程序一个(桌面应用程序上每个 JVM 一个)和一个 Web 应用程序,如果是 Web 服务器(例如 tomcat)或应用程序服务器(例如Weblogic 或 web 球体)。

但是,如果单个应用程序创建了多个池,则应与应用程序开发人员核实。

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

祝你好运
贾拉勒

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM