Skip to content

Commit e163f35

Browse files
committed
Fix for http://code.google.com/p/mybatis/issues/detail?id=578 . Deadlock in CachingExecutor and pooled datasources. Thanks to Chris Dadej.
1 parent 2188eb2 commit e163f35

File tree

2 files changed

+15
-12
lines changed

2 files changed

+15
-12
lines changed

pom.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,10 @@
5757
<name>Arkadi Shishlov</name>
5858
<email>[email protected]</email>
5959
</contributor>
60+
<contributor>
61+
<name>Chris Dadej</name>
62+
<email>[email protected]</email>
63+
</contributor>
6064
<contributor>
6165
<name>Franta Mejta</name>
6266
<email>[email protected]</email>

src/main/java/org/apache/ibatis/executor/CachingExecutor.java

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -87,20 +87,19 @@ public <E> List<E> query(MappedStatement ms, Object parameterObject, RowBounds r
8787
flushCacheIfRequired(ms);
8888
if (ms.isUseCache() && resultHandler == null) {
8989
ensureNoOutParams(ms, key, parameterObject, boundSql);
90-
cache.getReadWriteLock().readLock().lock();
91-
try {
92-
@SuppressWarnings("unchecked")
93-
List<E> cachedList = dirty ? null : (List<E>) cache.getObject(key);
94-
if (cachedList != null) {
95-
return cachedList;
96-
} else {
97-
List<E> list = delegate.<E> query(ms, parameterObject, rowBounds, resultHandler, key, boundSql);
98-
tcm.putObject(cache, key, list);
99-
return list;
90+
if (!dirty) {
91+
cache.getReadWriteLock().readLock().lock();
92+
try {
93+
@SuppressWarnings("unchecked")
94+
List<E> cachedList = (List<E>) cache.getObject(key);
95+
if (cachedList != null) return cachedList;
96+
} finally {
97+
cache.getReadWriteLock().readLock().unlock();
10098
}
101-
} finally {
102-
cache.getReadWriteLock().readLock().unlock();
10399
}
100+
List<E> list = delegate.<E> query(ms, parameterObject, rowBounds, resultHandler, key, boundSql);
101+
tcm.putObject(cache, key, list); // issue #578. Query must be not synchronized to prevent deadlocks
102+
return list;
104103
}
105104
}
106105
return delegate.<E>query(ms, parameterObject, rowBounds, resultHandler, key, boundSql);

0 commit comments

Comments
 (0)