jboss/wildfly 中的缓存连接管理器

Posted

技术标签:

【中文标题】jboss/wildfly 中的缓存连接管理器【英文标题】:Cached connection manager in jboss/wildfly 【发布时间】:2015-04-06 14:13:10 【问题描述】:

我已经为 JBoss AS 7.4 定义了一个数据源,具有最小/最大池大小、空闲连接跟踪等。

我对数据源use-ccm 属性感到困惑。

它有什么作用? 为什么要使用它?

我认为数据源本身管理连接池。

【问题讨论】:

access.redhat.com/solutions/309913 【参考方案1】:

要跟踪池的使用情况,需要在适当的记录器上启用调试并在数据源上启用统计信息。

<logger category="org.jboss.jca.core.connectionmanager.pool">
     <level name="DEBUG"/>
</logger>


<datasource jndi-name="java:jboss/jf/ds" pool-name="java:jboss/jf/ds" statistics-enabled="true">

【讨论】:

【参考方案2】:

它有什么作用?

它只是一个有用的调试工具,可通过检查其日志记录来检测手动管理事务 (BMT) 中的连接泄漏。在调试模式下打开时,它将记录应用程序代码获取和释放的所有连接以及查询。这可用于追踪应用程序代码中的连接泄漏。

JBoss AS 5 Administration Guide 比 JBoss AS 7 Administration Guide 和更新版本更能解释这一点。 WildFly 文档中甚至没有。以下摘录来自 JBoss AS 5 指南:

3.1。缓存连接管理器

缓存连接管理器用于调试数据源连接并支持事务中数据源连接的延迟登记,跟踪它们是否被应用程序正确使用和释放。以一些开销为代价,它可以提供使用情况跟踪,并确保来自数据源的连接不会被您的应用程序泄露。虽然这似乎是一个优势,但在某些情况下它被认为是一种反模式,因此应该避免。

[...]

在默认、标准和所有配置中,CachedConnectionManager 被配置为处于调试模式的 servlet 容器中。它也在生产配置中配置,但调试模式关闭。如果您不使用 BMT,和/或您没有前面描述的反模式,最好删除 CachedConnectionManager


为什么要使用它?

仅当您不使用容器管理事务 (CMT) 而是手动管理事务 (BMT) 时,才在调试模式下打开它并且您遇到了连接泄漏问题,您可以不要确定。一旦根据 CCM 的日志记录找到并在应用程序代码中修复,最好将其关闭以节省性能。

如果您正在使用 CMT,即您无法在应用程序中手动处理 Connection 和/或 UserTransaction 实例,而只是让 EJB+JTA 完成他们的辛勤工作,请不要使用它。


我认为数据源本身管理连接池。

它只在服务器和数据库之间进行。它不在服务器和应用程序代码之间执行此操作。使用 CMT 时,这一切都会自动发生。使用 BMT 时,应用程序代码开发人员对此负责。在这种情况下遇到连接泄漏时,可以使用 CCM 来解决。

另见Mastertheboss.com - How to trace JDBC statements with JBoss and WildFly。

【讨论】:

感谢@BalusC。关闭它时,我收到一条警告:“IJ000407:没有可用于 xxx 的惰性登记”。我可以放心地忽略它吗? @assylias:你可以忽略它们。这是一个已知问题,已在 AS7 中修复。另请参阅 issue 1122 和此 README 的先前版本(在 IJ000407 上按 Ctrl+F) 我在 wildfly 9 中收到警告,但实际上,链接说可以忽略它。谢谢。 没有使用-ccm,我的连接用完了。当我添加 use-ccm="true" 时,我并没有用完连接,也没有看到任何连接泄漏的迹象。离开 use-ccm="true" 可以吗,还是有其他方法可以找出我的连接在哪里泄漏?

以上是关于jboss/wildfly 中的缓存连接管理器的主要内容,如果未能解决你的问题,请参考以下文章

JBoss Wildfly JMS 客户端抛出服务器连接失败错误

当我无法访问 CLI 工具时,如何关闭 JBoss Wildfly?

如何忽略/升级 JBoss Wildfly 9 中的模块?

Java EE 远程客户的访问EJB实现实例(Jboss wildfly)

jboss wildfly 外网访问

JBoss Wildfly 9,JNDI 异常