Author: kai
Date: Fri May 1 11:51:29 2009
New Revision: 770644
URL: http://svn.apache.org/viewvc?rev=770644&view=rev
Log:
IBATIS-508 (Lock occurs when heavy traffic)
- applied the patch, testing before which option is the fastest one. See
http://www.kaigrabfelder.de/en/2009/05/01/concurrency_vs_synchronization.html
for a testcase
Modified:
ibatis/trunk/java/ibatis-2/ibatis-2-core/src/com/ibatis/common/beans/ClassInfo.java
Modified:
ibatis/trunk/java/ibatis-2/ibatis-2-core/src/com/ibatis/common/beans/ClassInfo.java
URL:
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-2/ibatis-2-core/src/com/ibatis/common/beans/ClassInfo.java?rev=770644&r1=770643&r2=770644&view=diff
==============================================================================
---
ibatis/trunk/java/ibatis-2/ibatis-2-core/src/com/ibatis/common/beans/ClassInfo.java
(original)
+++
ibatis/trunk/java/ibatis-2/ibatis-2-core/src/com/ibatis/common/beans/ClassInfo.java
Fri May 1 11:51:29 2009
@@ -15,9 +15,31 @@
*/
package com.ibatis.common.beans;
-import java.lang.reflect.*;
-import java.math.*;
-import java.util.*;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.ReflectPermission;
+import java.lang.reflect.UndeclaredThrowableException;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Date;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeMap;
+import java.util.TreeSet;
+import java.util.Vector;
+import java.util.concurrent.ConcurrentHashMap;
/**
* This class represents a cached set of class definition information that
@@ -28,7 +50,7 @@
private static boolean cacheEnabled = true;
private static final String[] EMPTY_STRING_ARRAY = new String[0];
private static final Set SIMPLE_TYPE_SET = new HashSet();
- private static final Map CLASS_INFO_MAP = Collections.synchronizedMap(new
HashMap());
+ private static final Map<Class, ClassInfo> CLASS_INFO_MAP = new
ConcurrentHashMap<Class, ClassInfo>();
private String className;
private String[] readablePropertyNames = EMPTY_STRING_ARRAY;
@@ -491,14 +513,12 @@
*/
public static ClassInfo getInstance(Class clazz) {
if (cacheEnabled) {
- synchronized (clazz) {
- ClassInfo cached = (ClassInfo) CLASS_INFO_MAP.get(clazz);
- if (cached == null) {
- cached = new ClassInfo(clazz);
- CLASS_INFO_MAP.put(clazz, cached);
- }
- return cached;
+ ClassInfo cached = (ClassInfo) CLASS_INFO_MAP.get(clazz);
+ if (cached == null) {
+ cached = new ClassInfo(clazz);
+ CLASS_INFO_MAP.put(clazz, cached);
}
+ return cached;
} else {
return new ClassInfo(clazz);
}