EJB 2.1 и постоянство, управляемое контейнером, в веб-сфере 8: средство поиска одного объекта вернуло 2 объекта

Мы используем EJB 2.1 с сохраняемостью, управляемой контейнером, в IBM Websphere 8 и имеем следующую проблему: одиночный поиск объектов иногда возвращает 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

person user2393881    schedule 17.05.2013    source источник


Ответы (1)


Я не эксперт по средствам поиска CMP, но это может быть связано с тем, что предопределенный запрос EJB QL не включает ключевое слово DISTINCT в предложение SELECT. то есть

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

(без звездочек)

person coderatchet    schedule 24.05.2013