我是不是需要在我的(grails)Web 应用程序中使用 C3P0 池库?

Posted

技术标签:

【中文标题】我是不是需要在我的(grails)Web 应用程序中使用 C3P0 池库?【英文标题】:Do I need to use C3P0 pooling library in my (grails) web application?我是否需要在我的(grails)Web 应用程序中使用 C3P0 池库? 【发布时间】:2011-02-17 17:13:29 【问题描述】:

我对连接池库一点也不熟悉。我刚刚通过blog article 发现了它,我不确定是否应该在基于 grails/hibernate/mysql 的 Web 应用程序中使用它。

所以我的问题很简单:您建议在哪些情况下将连接池库集成到 grails 应用程序中?总是、从不或仅超过某些连接阈值?

附: :如果您曾经在您的 Web 应用程序中成功使用过 C3P0,我将非常感谢您的反馈(就可见的积极影响而言)。

【问题讨论】:

【参考方案1】:

无论哪种池实现,您都应该在您的网络应用程序中始终使用连接池。打开与数据库的连接是一项非常昂贵的任务,并且能够重用已经存在的空闲连接可以大大提高您的网站性能。

连接可以由应用程序服务器(Tomcat、JBoss、Glassfish...)或您的应用程序管理。后者更容易设置,但很难根据部署进行自定义。在应用程序上配置连接池并设置您的站点以使用它可以轻松微调连接池参数,例如:保持打开的最小连接数、最大空闲时间等。

【讨论】:

谢谢!根据这个插件grails.org/plugin/jdbc-pool,Grails 有一个默认的 Grails Commons DBCP 池。这是否意味着 grails 按应用程序(而不是应用程序服务器)管理数据库连接?如果我把它换成 Tomcat JDBC Pool,它现在可能有更好的性能? 是的,默认情况下是应用程序。 Commons DBCP 是非常成熟的连接,但如果连接数量增加时性能很差并且变得更糟。改成 Tomcat JDBC Pool 是个不错的选择,它是一个新的实现,我正在研究它,看起来很有希望。【参考方案2】:

我在这方面的经验非常有限,但我最终使用了 C3P0,原因很简单,Hibernate 似乎无法处理 MySQL 重启。我每天早上都会收到“Broken pipe”,因为我们的托管服务每晚都会重新启动 MySQL。

我用谷歌搜索了它,我能找到的唯一建议是使用...应用服务器或 C3P0 的连接池。对我来说,后者工作得很好。

【讨论】:

每天午夜后我都会遇到同样的管道损坏问题,我们有 2 台服务器,其中一台因此停机。但是mysql从未重新启动它已经运行了很长时间。你仍然建议使用 C3P0 来解决同样的问题吗? 嗯,已经五年了,情况不同,所以我不能确定。但是 C3P0 的代码仍然在我的应用程序中,而且我没有任何损坏的管道,所以我不会删除它 :-) 我会说试试看!【参考方案3】:

我总是使用连接池有两个原因:

    因为打开连接是一项昂贵的操作 设置一个透明地工作非常简单,所以使用它并没有真正的优势。

如果您已经在使用休眠,只需修改您的 hibernate.cfg.xml 的 connection.provider_class 以使用 org.hibernate.connection.C3P0ConnectionProvider 并抛出 c3p0 jar文件到你的 servlet 的 WEB-INF/lib 文件夹中。完成。

如果您使用 JNDI 和 GlobalNamingResources 声明,请修改 type 属性以指向 com.mchange.v2.c3p0.ComboPooledDataSource 并将 c3p0 jar 放入Tomcat 的 /lib 文件夹。完成。

【讨论】:

【参考方案4】:

C3P0 是一个非常不错的池,但我仍然建议使用您的应用服务器或 servlet 引擎的连接池,并将 Grails 配置为通过常规数据源使用它。当您无法做到这一点时,请使用独立的连接池(在这种情况下,C3P0 是一个不错的选择)。

【讨论】:

嗨帕斯卡。谢谢你的回答。不幸的是,它给我带来了更多问题 :-) 应用程序服务器的连接池是什么(我在 Tomcat 上运行我的应用程序)? Grails 默认使用应用服务器的连接池吗?是 DataSource 中的 pooled = true 吗?

以上是关于我是不是需要在我的(grails)Web 应用程序中使用 C3P0 池库?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Grails 中实现超时页面

我应该将 javascript 库放在 Grails 应用程序的啥位置?

使用 Spring Security 3 在我的 Grails OAuth 提供程序上存储访问令牌

如何在我的项目中实现 Grails 的 Shiro 安全性

重用 Grails 标准闭包的一部分

grails中唯一的随机令牌生成