0

该应用程序使用官网提供的 JDBC 驱动程序连接到 oracle 11G 数据库。当来自连接到同一架构的不同实例的许多用户(大约 50 个)开始使用该应用程序时,我在应用程序周围遇到了一些冻结,当我运行查询以获取锁定会话和锁定对象时,我发现只有“行独占”锁定类型,通常不应锁定所有表并允许多个会话执行 DML 查询。因此,我的问题是行独占表何时可以锁定整个表,否则会引发这些冻结。

注意:我在论坛上环顾四周,看到了一些 MAXTRANS 和 ITL 配置,这些参数会导致这些冻结吗?

谢谢

4

2 回答 2

0

也许现在责怪甲骨文还为时过早。它可能是 servlet 容器配置,例如没有足够的 exec 线程。或者它可能是内部争用。很多事情都可能出错。识别瓶颈的一种快速方法是在应用程序遇到“应用程序周围的一些冻结”时获取线程转储,并查看您的线程卡在哪里。您可以通过向 Java 进程发送 kill -3 来获取线程转储。把它贴在这里,很高兴看到它。

于 2016-05-16T18:25:39.530 回答
0

我认为您的术语混淆了..“行独占”锁定意味着“我已锁定此行..不允许其他会话更新它”。

因此,如果您有 50 个会话都试图更新或删除特定行,那么是的.. 您将有争用。这将严重限制你的表现。

所以我猜想您的应用程序可能缺少一条commit语句,该语句会在修改行后释放锁。

您说您正在使用序列..您是在使用实际的 oracle 序列(即create sequence my_seq;),还是在做自定义的事情,select max(id)+1 from sequence_table 这将是另一个坏主意。

于 2016-05-16T15:27:21.137 回答