我们在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
我不是CMP查找器方面的专家,但这可能是由于EJB QL预定义的查询没有在SELECT子句中包含DISTINCT关键字。例如
SELECT **DISTINCT** OBJECT(o) FROM YourEntity AS o WHERE o.id = ?1;
(不带星号)