2011-09-06 58 views
1

我有一个情况我需要在JMS(分组消息)接收大文件的部分并将其存储在数据库中。同步问题与JMS和JPA

问题是,组中的每条消息将在TABLE A中为一行,并存在@ManytoOneTABLE B。这意味着对于一个组将只有一个表B中的条目,但表A中的许多条目。

我目前的逻辑是,在插入table A之前,我正在检查任何条目(@NamedQuery,作为主键在那时不会被MDB知道),如果没有找到,则创建一个新的(在这里创建主键Table B)。

由于有接收同一组的消息的MDB多个实例,在table B条目被复制得到为同一消息组,由于第一创建的表B条目不尚未comiitted在MDB交易。

要更加清楚:

步骤1:接收消息。

步骤2:创建表A所需的实体。检查表B中是否有相同组ID的条目(READ),如果找到,设置关系并保留,如果不存在,则为表B创建一个新实体(WRITE)(通过服务生成主键)设置关系并保留。

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

有没有什么办法可以解决这个问题? 1.我使用eclipselink和Oracle,使用@PersistenceContext注解来注入容器管理事务和实体管理器。

谢谢

+0

具有多于1个MDB并不能保证你更高的吞吐量(猜测是,在您的使用情况下,DB是最大的因素),这将是MDB实例所允许的数量限制为1的解决方案?易于通过部署描述符来完成。 Glassfish服务器? – fvu

回答

1

不完全确定你在做什么?你是否试图防止这两个交易创建一个新的A,或只有一个新的B?

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

另一个解决方案是在A使用悲观锁的交易,这将确保该交易不冲突。

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