0

我们在 IBM Websphere 8 中使用具有容器管理持久性的 EJB 2.1,并且存在以下问题:即使数据库中只有一个元素用于此搜索条件,单个对象查找器有时也会返回 2 个元素。这只发生在许多线程访问同一个数据库条目时。

我们使用 wsOptimisticUpdate 作为访问意图。在事务内部,首先使用业务键搜索元素(这是单个对象查找器,有时会找到 2 个元素,因此会引发异常),然后进行更新。如果许多线程正在为同一个业务密钥执行此操作,则会发生此错误。

对该异常使用断点并检查数据库上未提交的读取,可以看出数据库中只有一个元素。所以看起来 CMP 实现并不是真正的线程安全。有没有人遇到过这样的问题?

Caused by: javax.ejb.FinderException: Single object finder returned 2 objects.
    at
com.ibm.ws.ejbpersistence.beanextensions.ConcreteBeanStatefulInstanceExtensionImpl.executeFind(ConcreteBeanStatefulInstanceExtensionImpl.java:1579)
    at
4

1 回答 1

0

我不是 CMP 查找器方面的专家,但这可能是由于 EJB QL 预定义查询未在您的 SELECT 子句中包含 DISTINCT 关键字。IE

SELECT **DISTINCT** OBJECT(o) FROM YourEntity AS o WHERE o.id = ?1;

(不带星号)

于 2013-05-24T07:58:43.437 回答