【问题标题】:JMS Multiple messages locks database tableJMS 多条消息锁定数据库表
【发布时间】:2013-09-08 00:38:44
【问题描述】:

我的网络服务一次接收多个包含学生数据的 XML 文件 我需要处理该文件并将值存储到数据库。

为此,我使用了 JMS 队列。我正在创建对象消息并推送到队列。 但是当队列正在处理消息时,另一条消息可用于处理,因此我的数据库表被锁定。

考虑到我有一个包含 5000 个值的列表,并且在 for 循环中我正在迭代列表并处理 JMS 消息。

这正是我的场景。问题是在处理一条消息时,我的表被锁定,其余文件保持在队列中。

提出一些解决方案

【问题讨论】:

  • 我不太明白JMS和数据库之间的联系。您使用什么 JMS 提供程序?
  • 实际上我只是通过使用 JMS 队列在后端处理数据库操作,以便用户立即获得响应并在后端运行处理
  • 请出示代码。您的方法或设计似乎有问题。
  • 从 JMS 队列读取和写入数据库通常需要考虑事务性。你的交易边界在哪里?您是否在每条消息之后提交或在事务中聚合多条消息等。请在问题中详细说明和/或阅读事务。这可能是问题的一部分
  • 再次,请显示代码和/或添加更多信息,以便我们可以在那里回答:oracle row contention causing deadlock errors

标签: java queue jms


【解决方案1】:

如果我理解正确,数据库处理是在侦听器中将消息从队列中取出。

您必须担心数据库隔离和表/行锁定,因为每个侦听器都在自己的线程中运行。

您必须锁定行或将数据库上的 ISOLATION 级别设置为 SERIALIZABLE 以保证一次只有一个线程会插入或更新表。

【讨论】:

  • 我需要将事务级别保持为 READ_UNCOMMITED
【解决方案2】:
  1. 确保使用正确的lock strategy(请参阅表级锁定和行级锁定)
  2. 看看您是否可以一次处理一条消息,(JMS 消费者配置)这样,第一条消息将释放第二条消息的锁定,依此类推

编辑:错字和链接

【讨论】:

    猜你喜欢
    • 2017-07-25
    • 1970-01-01
    • 2014-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-10
    • 1970-01-01
    相关资源
    最近更新 更多