[ https://issues.apache.org/jira/browse/IBATIS-249?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12580678#action_12580678 ]
A Rahman commented on IBATIS-249: --------------------------------- Clinton, Thanks a lot for your quick reply. I will dig in my code. But here are my results. Please let me know when the next release will be available for download When I test my application manually as a single user for more than an hour continuously doing lots of retrieval, insert, update and deletes, I don't see this problem, also I monitor the database at the same time no open connections left. I ran a simple load test with 5 concurrent users, doing simple retrieval of records, the deadlock occurs and I also see some open connections waiting in the database to be closed and application is dead. Abdur Rahman > Race conditions in Throttle lead to thread blockage popping items from > ThrottledPools under stress > -------------------------------------------------------------------------------------------------- > > Key: IBATIS-249 > URL: https://issues.apache.org/jira/browse/IBATIS-249 > Project: iBatis for Java > Issue Type: Bug > Components: SQL Maps > Affects Versions: 2.1.7 > Reporter: Jonathan Burstein > Assignee: Sven Boden > Fix For: 2.2.0 > > Attachments: IBATIS-249.diff > > > com.ibatis.common.util.Throttle.increment contains a synchronization error. > Currently, when a waiting thread returns from LOCK.wait it will increment > count and return without checking that count is below limit. There are a > number of situations where LOCK.wait can complete but the count will not be > less than the limit: > 1) The wait was interrupted > 2) There was a spurious thread wakeup > 3) Another thread obtained the lock between the time LOCK.notify was called > (by a thread calling decrement) and the wait returned. > The fix here is to re-check the value of count after exiting the wait (using > a while loop). A small amount of extra logic is necessary to satisfy maxWait > properly. > ThrottledPool.pop attempts to work around these race conditions by catching > swallowing all exceptions from throttle.increment and pool.remove(0) and > looping until an item is obtained. Since the increment call is within the > loop this logic can lead to multiple increments with no corresponding > decrements. Note that an IndexOutOfBound exception from pool.remove(0) is an > artifact of the bug in Throttle.increment -- this could never occur if > Throttle behaved correctly. > This routine should simple call throttle.increment and pool.remove(0). It > should most certainly not swallow exceptions. > Finally, ThrottledPool.push incorrectly calls throttle.decrement if the > parameter is invalid (null or of an incorrect type). -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.