@@ -87,20 +87,19 @@ public <E> List<E> query(MappedStatement ms, Object parameterObject, RowBounds r
87
87
flushCacheIfRequired (ms );
88
88
if (ms .isUseCache () && resultHandler == null ) {
89
89
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 ();
100
98
}
101
- } finally {
102
- cache .getReadWriteLock ().readLock ().unlock ();
103
99
}
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 ;
104
103
}
105
104
}
106
105
return delegate .<E >query (ms , parameterObject , rowBounds , resultHandler , key , boundSql );
0 commit comments