Hibernate:啥是连接池,为啥默认的连接池不适合生产?

Posted

技术标签:

【中文标题】Hibernate:啥是连接池,为啥默认的连接池不适合生产?【英文标题】:Hibernate: What is the connection pool and why is the default one unsuitable for production?Hibernate:什么是连接池,为什么默认的连接池不适合生产? 【发布时间】:2011-06-20 07:35:51 【问题描述】:

我对 Hibernate 非常不熟悉,并且刚刚开始开发一个将它与 mysql 数据库一起使用的 Web 应用程序。我注意到community documentation tutorial 声明:

内置的 Hibernate 连接池绝不用于生产用途。它缺少在任何体面的连接池上都可以找到的几个功能。

有人可以详细说明吗?它到底缺少什么,人们对“默认”有什么问题?在谷歌搜索中,我找到了一个网站here,但它并没有真正解释问题,只是你应该使用什么。

【问题讨论】:

【参考方案1】:

什么是连接池,为什么默认的连接池不适合生产?有人可以详细说明一下吗?

连接池是一种打开/准备/关闭连接的技术。连接池机制是一个软件(组件),您将管理连接的功能委托给它。您的应用程序只会请求一个连接,使用它,然后将其送回池中。该组件负责打开 N 个连接,并在您的应用程序请求时让它们准备好。如果连接过时,池化机制将关闭它并重新打开一个新连接。这代表了对连接的更好使用,因为您无需在实际执行代码期间等待连接建立,也不必担心过时的连接。

Hibernate 并没有真正提供任何真正的连接池机制。它提供了一个非常初级的内部连接管理器。原因很简单:几乎(如果不是全部)应用服务器(如 JBoss AS)和 Servlet 容器(如 Tomcat)默认提供连接池机制。因此,您的应用程序不必担心有关它的详细信息。它只是向 AS 请求连接。

在我看来,只有两种情况需要担心连接池:

    您正在处理一个独立的应用程序(不在容器内运行) 您是连接池方面的专家,现有的连接池都不适合您的需求。

但根据我的经验,大多数使用“外部”连接池的人这样做是因为缺乏关于连接池的知识并且缺乏关于他们的容器的知识。

【讨论】:

@jpkrohling,很好的解释:-) @jpkrohling,那么如果我让 Hibernate 默认连接池用于生产可以吗? 我和@Ommadawn 有同样的问题。这是一个很好的解释,但不是很有帮助。例如,如果我是 Tomcat 或 Wildfly - 我该如何使用他们的连接池?【参考方案2】:

当您处理一个独立的应用程序时,有几个池管理器尚未由 Hibernate 维护。 Hibernate 从不偏爱一个显式的。多年来,许多人来了又消失了。到底哪个是最好的,真的很难判断。最好自己检查和比较这些项目以及这些项目的活跃程度。

以下是最近(2017 年)针对独立应用程序按字母顺序排列的一些池化建议:

C3P0http://www.mchange.com/projects/c3p0/

光https://github.com/brettwooldridge/HikariCP

维伯http://www.vibur.org/

【讨论】:

欢迎提供解决方案链接,但请确保您的答案在没有它的情况下有用:add context around the link 这样您的其他用户就会知道它是什么以及为什么会出现,然后引用最相关的内容您链接到的页面的一部分,以防目标页面不可用。 Answers that are little more than a link may be deleted. 嗨,警察,我的回答只是对来这里的人有所帮助。很难说哪个连接池是合适的。所以我尽量保持中立。当然,您可能会投反对票,但这不是***,它肯定是基于意见的,但没有水手会因为在这里有一些链接的答案而死。所以请尽量不要那么粗鲁。【参考方案3】:

hibernate 中默认的连接池是c3p0,以星球大战角色命名。但是hibernate也支持proxool并且曾经也宣传apache dbcp。有一段时间,DBCP 处于休眠状态,失宠了。

C3P0 实际上在许多项目的生产中使用。尽管有时会发现它在高峰时间表现不佳。有几种选择。例如 Tomcat 7 中包含的新连接池。虽然我还没有测试过,但听到了一些关于它的积极反馈。

【讨论】:

感谢您的回答,那么“社区文档”是否已过时? 不,我不这么认为。似乎这个问题更多地与社区的惯性有关。由于 3.3 (2008) C3P0 与休眠解耦(提供程序类 C3P0ConnectionProvider 已从核心 jar 中移出),看起来开发人员试图使 c3p0 的使用不那么简单,但社区总是回归其旧习惯。 您是否有任何参考资料支持您确认 Hibernate 中的默认连接池是 c3p0? 我不认为休眠中的默认连接池是 c3p0

以上是关于Hibernate:啥是连接池,为啥默认的连接池不适合生产?的主要内容,如果未能解决你的问题,请参考以下文章

性能测试:连接池不释放

Jboss连接池不与DataBase连接

Tomcat 池不重置池。获得太多连接错误

解决tomcat数据库连接池不释放连接数问题

Go http client 连接池不复用的问题

为什么数据库连接池不采用 IO 多路复用?