JMS 和 JPA 的同步问题

发布于 2024-12-03 01:28:58 字数 833 浏览 3 评论 0原文

我遇到一种情况,我需要通过 JMS(分组消息)接收大文件的一部分并将其存储在数据库中。

问题在于,组中的每条消息都将是 TABLE A 中的一行,并且与 TABLE B 存在 @ManytoOne 关系。这意味着对于一个组来说,表 B 中只有一个条目,但表 A 中有许多条目。

我当前的逻辑是,在插入 表 A 之前,我正在检查是否有任何条目(@ NamedQuery,因为当时MDB不知道主键),如果找不到,则创建一个新的(在此处创建Table B的主键) )。

由于 MDB 有多个实例接收同一组中的消息,因此对于同一消息组,表 B 中的条目会重复,因为 MDB 中的事务首先创建条目因为表 B 尚未提交。

更清楚地说:

步骤1:接收消息。

步骤2:创建TABLE A所需的实体。检查B表中是否有相同组ID的条目(READ),如果找到,则设置关系并持久化,如果没有,则创建一个新实体对于表 B(WRITE)(具有由服务生成的主键)设置关系并保留。

问题是,MDB 的多个实例为表 B 创建条目,因为它在READ 期间无法找到该条目(由第一个 MDB 创建),因此 WRITING 新条目对于相同的组 ID。

我有什么办法可以克服这个问题吗? 1.我正在使用 eclipselink 和 Oracle ,容器管理的事务和实体管理器是使用 @PersistenceContext 注释注入的。

谢谢

I have a situation where I need to receive parts of a large file over JMS(grouped messages) and store it in DB.

The problem is that each message in group will be one row in TABLE A and there is @ManytoOne realtionship to TABLE B. Which means the for one group there will be only one entry in table B but many entries in table A.

My current logic is such that before inserting in table A, I'm checking for any entries(@NamedQuery, as the primary key would NOT be known to the MDB at that time), and if not found, creating a new one(creating the primary key of Table B here).

Since there are multiple instances of MDB receiving the messages in same group, the entries in table B are getting duplicated for same message group, since the transaction in MDB which first created entry for TABLE B is not not comiitted yet.

To be more clear:

Step 1: Receiving the message.

Step 2: Create the entitiy required for TABLE A. Check whether there's any entries with same group ID in table B(READ), if found, set the relationship and persist, if not, create a new entity for table B(WRITE) (with generated primary key by a service) set the relationship and persist.

The issue is, multiple instances of MDB creates entry for table B, since it not able to find the entry(created by the first MDB) during READ, hence WRITING new entries for same group ID.

Is there any way I can overcome this problem ?
1. I'm using eclipselink and Oracle , Container managed transaction and entity managers are injected using @PersistenceContext annotation.

Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

耳钉梦 2024-12-10 01:28:58

不太确定你在做什么?您是否试图阻止两个事务创建新的 A,或仅创建新的 B?

您可以为B表中的A外键添加唯一约束。这将确保第二次为 A 插入 B 的尝试将会失败。

另一种解决方案是在事务A上使用悲观锁,这将确保事务不会发生冲突。

您还可以通过强制 A 的版本递增来使用乐观锁,这将导致第二次尝试失败。实际上,由于 A 有一个到 B 的 ManyToOne,它的版本应该增加,所以你应该已经得到一个锁定错误。

Not exactly sure what you are doing? Are you trying to prevent both transactions from creating a new A, or only a new B?

You can add a unique constraint on the A foreign key in the B table. This will ensure the second attempt to insert a B for the A will fail.

Another solution is to use a pessimistic lock on the A for the transaction, this will ensure the transaction do not conflict.

You could also use an optimistic lock by forcing the version of A to increment, this will cause the second attempt will fail. Actually since A has a ManyToOne to B, its version should increment, so you should get a lock error already.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文