【问题标题】:How Can I Monitor The Database Transactions in my multi-threaded, EJB2 JBoss Application?如何监控我的多线程 EJB2 JBoss 应用程序中的数据库事务?
【发布时间】:2012-09-28 11:15:38
【问题描述】:

我在我的应用程序中遇到了可重现的 Oracle 死锁。对代码的初步调查并没有发现任何明显的原因,所以我想在记录正在运行的 SQL 以及最重要的是在其中发生的事务时重新创建这种情况。

我开始添加自己的调试语句,但这似乎是我在重新发明轮子,并且已经证明容易出错(我最初错过了我的 EJB 方法之一被定义为“RequiresNew”)

是否有工具可以做到这一点?我看过:

  • log4jdbc,但从我看到的文档中并不清楚 将记录单独的事务,而且它不支持 数据源,所以我需要解决这个问题。

  • jdbcslog - 也不清楚它是否会记录事务

或者我错过了一些更明显的方法来做到这一点?

【问题讨论】:

  • 您查找的原因是什么?
  • 两个独立的事务,以不同的顺序锁定相同的资源(行)。即事务 1 更新 a 行,事务 2 更新 b 行,然后事务 1 尝试更新 b 行,但由于事务 2 已经拥有它而等待,事务 2 尝试更新 a 行并等待,因为事务 1 已经拥有它。宾果 - 僵局。我一直在寻找这种场景,然后寻找更复杂的、跨越更多资源的场景。
  • 您设置的隔离级别是多少?可序列化?
  • 老实说,我处理这类事情的方式是将所有内容记录到一个平面文件中并进行挖掘。老式的,我知道。它唯一的优点是它有效。分享和享受。
  • 数据库本身在各种视图中公开锁信息。对于普通开发人员来说,这有点涉及,但 Oracle DBA 应该能够为您提供信息。具体来说,正在等待什么、锁定什么以及由谁锁定。

标签: java oracle jboss database-deadlocks


【解决方案1】:

解决了几次类似的情况。仅通过会话记录在复杂的应用程序中找到解决方案非常困难(我称之为幸运)。 (Oracle 杀死其中一个会话。一个被杀死,另一个快乐地继续存在)

最好的解决方案是询问你的 DBA(或者如果你可以访问你的 oracle 安装,你可以谷歌然后自己获取它们,这并不复杂)跟踪文件(这个文件是在终止会话的例外中提到的,所以搜索你的警报日志),会有死锁图。 (只是 DEADLOCK 的全文跟踪文件)

只需在此处查看如何查看跟踪文件的确切信息。 LINK

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-15
    • 2015-02-03
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    • 2021-04-28
    • 1970-01-01
    • 2019-07-18
    相关资源
    最近更新 更多