mysql - 如果池大小小于并发连接数,Hibernate 池如何工作?

标签 mysql hibernate c3p0

我使用 Hibernate 和 c3p0 作为池提供程序。我仅将其最大大小设置为 50。现在,我使用 1000 个并发线程连续访问数据库并使用 mysql max_connections 为 2000 对应用程序执行负载测试。我从应用程序中得到了正确的响应,但有时我会遇到套接字异常错误。

那么,第一件事是,如果我的池大小仅为 50,那么 hibernate 如何管理 1000 个连接?这是否意味着从池中取出 50 个连接并创建其余连接?另外,为什么我必须得到套接字异常,例如连接重置异常?

最佳答案

如果您已正确设置并且 c3p0 的 maxPoolSize 为 50,那么如果有 1000 个客户端进入池,则 50 个客户端将首先获得连接,其余的将短暂 wait() 直到第一个队列返回连接。池的工作是与应尽可能短暂地保存连接的应用程序协作,以确保有效共享有限数量的连接。

如果您偶尔看到连接重置/套接字异常,您可能应该配置一些连接测试:

http://www.mchange.com/projects/c3p0/index.html#configuring_connection_testing

最新的预发布版本有一些关于连接测试的更直接的建议;您可以下载该文件或从此处开始阅读 html 源代码:

https://github.com/swaldman/c3p0/blob/master/src/doc/index.html#L1071

关于mysql - 如果池大小小于并发连接数,Hibernate 池如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17051070/

相关文章:

java - 连接池 - 为什么要在 checkin 时测试连接?

mysql - 具有子关系的关系中的 Laravel Eloquent 限制

hibernate - 如何避免使用 hibernate 模式更新

java - JAR 文件失败 - Maven 和 Hibernate 项目

java - Hibernate 和 C3p0 池的问题

java - 数据库宕机时C3p0重连数据库失败

php - 如何使用sql查询从另一个表中获取数据?

java - OOD - 避免每个成员变量使用重复函数 (Java)

php - MySQL连接返回冗余数据

mysql - 无法连接亚马逊MYSQL