[
https://issues.apache.org/jira/browse/OPENJPA-2507?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14011108#comment-14011108
]
Kevin Sutter commented on OPENJPA-2507:
---------------------------------------
Interesting. The more I look into this default Stack implementation, it
doesn't look to be very solid. Even in the Javadoc for Stack, it recommends
the use of Deque instead:
"A more complete and consistent set of LIFO stack operations is provided by the
Deque[1] interface and its implementations, which should be used in preference
to this class. For example:
Deque<Integer> stack = new ArrayDeque<Integer>();"
[1] http://docs.oracle.com/javase/7/docs/api/java/util/Deque.html
And, looking at the Deque's peek operation, it doesn't throw an exception if
it's empty, it just returns null. It might be better to just use the Deque
collection instead of Stack... Of course, this would have a larger ripple
effect in the code base...
It's good to know that your proposed hack seems to resolve the issue for you.
Maybe that's what we need to do for the time being and worry about the "larger
fish" at a later time... I have also reached out to Pinaki to see if he has
any preference.
> Weird EmptyStackException in CriteriaQueryImpl
> ----------------------------------------------
>
> Key: OPENJPA-2507
> URL: https://issues.apache.org/jira/browse/OPENJPA-2507
> Project: OpenJPA
> Issue Type: Bug
> Components: criteria
> Affects Versions: 2.2.0, 2.3.0
> Environment: openjpa 2.2.0 & 2.3.0, spring-data-jpa up to 1.4.2
> Reporter: Ioannis Alexandrakis
> Priority: Minor
> Labels: criteria_api, openjpa
>
> Using spring-data-jpa with openjpa, I sometimes encounter a strange error
> (not all the times, but under heavy load it makes its appearance, sparsely
> though):
> ....
> Caused by: java.util.EmptyStackException
> at java.util.Stack.peek(Stack.java:<arbitrary line>)
> at
> org.apache.openjpa.persistence.criteria.CriteriaQueryImpl.ctx(CriteriaQueryImpl.java:<arbitrary
> line>
> ....
> I do not know which behaviour triggers it, however I think it would be an
> improvement to change (I did not know where exactly to file it, because it is
> both an improvement and a bug in my opinion), in
> org.apache.openjpa.persistence.criteria.CriteriaQueryImpl, method: Context
> ctx(), this:
> return _contexts == null || _contexts.isEmpty() ? null : _contexts.peek();
> to something like this:
> try {
> return _contexts == null || _contexts.isEmpty() ? null :
> _contexts.peek();
> } catch (EmptyStackException e) {
> return null;
> }
> , in order to prevent a case where multiple threads modify the "_contexts"
> between the evaluation of the inline "if".
> I am not able to reproduce it all the time, thus I can't create a useful
> test, neither have I created a patch due to the simplicity of the 'fix'.
> However I believe it is a harmless fix which could be considered a minor
> improvement.
--
This message was sent by Atlassian JIRA
(v6.2#6252)