You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by kw...@apache.org on 2007/02/16 14:52:09 UTC
svn commit: r508395 - in
/incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa:
ee/JNDIManagedRuntime.java kernel/BrokerImpl.java
kernel/FetchConfigurationImpl.java util/ImplHelper.java util/OpenJPAId.java
Author: kwsutter
Date: Fri Feb 16 05:52:08 2007
New Revision: 508395
URL: http://svn.apache.org/viewvc?view=rev&rev=508395
Log:
OPENJPA-141. A few improvements to the performance-related changes done with the previous Issue. Reference OPENJPA-141 for details. Biggest change was moving some of the common caching code to ImplHelper.
Modified:
incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/ee/JNDIManagedRuntime.java
incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/BrokerImpl.java
incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/FetchConfigurationImpl.java
incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/ImplHelper.java
incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/OpenJPAId.java
Modified: incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/ee/JNDIManagedRuntime.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/ee/JNDIManagedRuntime.java?view=diff&rev=508395&r1=508394&r2=508395
==============================================================================
--- incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/ee/JNDIManagedRuntime.java (original)
+++ incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/ee/JNDIManagedRuntime.java Fri Feb 16 05:52:08 2007
@@ -29,7 +29,7 @@
implements ManagedRuntime {
private String _tmLoc = "java:/TransactionManager";
- private static TransactionManager _tm;
+ private TransactionManager _tm = null;
/**
* Return the location of the {@link TransactionManager} in JNDI.
@@ -43,12 +43,14 @@
*/
public void setTransactionManagerName(String name) {
_tmLoc = name;
+ _tm = null; // reset the cached TM
}
/**
* Return the cached TransactionManager instance.
*/
public TransactionManager getTransactionManager() throws Exception {
+
if (_tm == null) {
Context ctx = new InitialContext();
try {
Modified: incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/BrokerImpl.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/BrokerImpl.java?view=diff&rev=508395&r1=508394&r2=508395
==============================================================================
--- incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/BrokerImpl.java (original)
+++ incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/BrokerImpl.java Fri Feb 16 05:52:08 2007
@@ -63,7 +63,6 @@
import org.apache.openjpa.lib.util.ReferenceHashMap;
import org.apache.openjpa.lib.util.ReferenceHashSet;
import org.apache.openjpa.lib.util.ReferenceMap;
-import org.apache.openjpa.lib.util.concurrent.ConcurrentReferenceHashMap;
import org.apache.openjpa.lib.util.concurrent.ReentrantLock;
import org.apache.openjpa.meta.ClassMetaData;
import org.apache.openjpa.meta.FieldMetaData;
@@ -75,6 +74,7 @@
import org.apache.openjpa.util.CallbackException;
import org.apache.openjpa.util.Exceptions;
import org.apache.openjpa.util.GeneralException;
+import org.apache.openjpa.util.ImplHelper;
import org.apache.openjpa.util.InternalException;
import org.apache.openjpa.util.InvalidStateException;
import org.apache.openjpa.util.NoTransactionException;
@@ -139,9 +139,6 @@
private static final Localizer _loc =
Localizer.forPackage(BrokerImpl.class);
- // Cache for from/to type assignments
- private static ConcurrentReferenceHashMap _assignableTypes =
- new ConcurrentReferenceHashMap(ReferenceMap.HARD, ReferenceMap.WEAK);
// the store manager in use; this may be a decorator such as a
// data cache store manager around the native store manager
@@ -1101,7 +1098,8 @@
cls));
return PCRegistry.newObjectId(cls, (String) val);
}
- if (isAssignable(meta.getObjectIdType(), val.getClass())) {
+ if (ImplHelper.isAssignable(meta.getObjectIdType(), val.getClass()))
+ {
if (!meta.isOpenJPAIdentity() && meta.isObjectIdTypeShared())
return new ObjectId(cls, val);
return val;
@@ -1120,37 +1118,6 @@
} finally {
endOperation();
}
- }
-
- /**
- * Cache from/to assignments to avoid Class.isAssignableFrom overhead
- * @param from the target Class
- * @param to the Class to test
- * @return true if the "to" class could be assigned to "from" class
- */
- private boolean isAssignable(Class from, Class to) {
- boolean isAssignable;
- ConcurrentReferenceHashMap assignableTo =
- (ConcurrentReferenceHashMap) _assignableTypes.get(from);
-
- if (assignableTo != null) { // "to" cache exists...
- isAssignable = (assignableTo.get(to) != null);
- if (!isAssignable) { // not in the map yet...
- isAssignable = from.isAssignableFrom(to);
- if (isAssignable) {
- assignableTo.put(to, new Object());
- }
- }
- } else { // no "to" cache yet...
- isAssignable = from.isAssignableFrom(to);
- if (isAssignable) {
- assignableTo = new ConcurrentReferenceHashMap(
- ReferenceMap.HARD, ReferenceMap.WEAK);
- _assignableTypes.put(from, assignableTo);
- assignableTo.put(to, new Object());
- }
- }
- return isAssignable;
}
/**
Modified: incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/FetchConfigurationImpl.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/FetchConfigurationImpl.java?view=diff&rev=508395&r1=508394&r2=508395
==============================================================================
--- incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/FetchConfigurationImpl.java (original)
+++ incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/FetchConfigurationImpl.java Fri Feb 16 05:52:08 2007
@@ -36,11 +36,10 @@
import org.apache.openjpa.lib.rop.SimpleResultList;
import org.apache.openjpa.lib.rop.WindowResultList;
import org.apache.openjpa.lib.util.Localizer;
-import org.apache.openjpa.lib.util.ReferenceMap;
-import org.apache.openjpa.lib.util.concurrent.ConcurrentReferenceHashMap;
import org.apache.openjpa.meta.ClassMetaData;
import org.apache.openjpa.meta.FetchGroup;
import org.apache.openjpa.meta.FieldMetaData;
+import org.apache.openjpa.util.ImplHelper;
import org.apache.openjpa.util.InternalException;
import org.apache.openjpa.util.NoTransactionException;
import org.apache.openjpa.util.UserException;
@@ -60,10 +59,6 @@
private static final Localizer _loc = Localizer.forPackage
(FetchConfigurationImpl.class);
- // Cache the from/to isAssignable invocations
- private static ConcurrentReferenceHashMap _assignableTypes =
- new ConcurrentReferenceHashMap(ReferenceMap.HARD, ReferenceMap.WEAK);
-
/**
* Configurable state shared throughout a traversal chain.
*/
@@ -563,7 +558,7 @@
// see if there's a previous limit
int avail = Integer.MIN_VALUE;
for (FetchConfigurationImpl f = this; f != null; f = f._parent) {
- if (isAssignable(type, f._fromType)) {
+ if (ImplHelper.isAssignable(type, f._fromType)) {
avail = f._availableRecursion;
if (traverse)
avail = reduce(avail);
@@ -588,15 +583,15 @@
max = cur;
}
// reduce max if we're traversing a self-type relation
- if (traverse && max != Integer.MIN_VALUE
- && isAssignable(meta.getDescribedType(), type))
+ if (traverse && max != Integer.MIN_VALUE
+ && ImplHelper.isAssignable(meta.getDescribedType(), type))
max = reduce(max);
// take min/defined of previous avail and fetch group max
if (avail == Integer.MIN_VALUE && max == Integer.MIN_VALUE) {
int def = FetchGroup.RECURSION_DEPTH_DEFAULT;
- return (traverse && isAssignable(meta.getDescribedType(), type))
- ? def - 1 : def;
+ return (traverse && ImplHelper.isAssignable(
+ meta.getDescribedType(), type)) ? def - 1 : def;
}
if (avail == Integer.MIN_VALUE || avail == FetchGroup.DEPTH_INFINITE)
return max;
@@ -616,40 +611,6 @@
if (fm.getKey().isDeclaredTypePC())
return fm.getKey().getDeclaredType();
return null;
- }
-
- /**
- * Whether either of the two types is assignable from the other. Optimize
- * for the repeat calls with similar parameters by caching the from/to
- * type parameters.
- */
- private static boolean isAssignable(Class from, Class to) {
- boolean isAssignable;
-
- if (from == null || to == null)
- return false;
- ConcurrentReferenceHashMap assignableTo =
- (ConcurrentReferenceHashMap) _assignableTypes.get(from);
-
- if (assignableTo != null) { // "to" cache exists...
- isAssignable = (assignableTo.get(to) != null);
- if (!isAssignable) { // not in the map yet...
- isAssignable = from.isAssignableFrom(to);
- if (isAssignable) {
- assignableTo.put(to, new Object());
- }
- }
- } else { // no "to" cache yet...
- isAssignable = from.isAssignableFrom(to);
- if (isAssignable) {
- assignableTo = new ConcurrentReferenceHashMap(
- ReferenceMap.HARD, ReferenceMap.WEAK);
- _assignableTypes.put(from, assignableTo);
- assignableTo.put(to, new Object());
- }
- }
-
- return isAssignable;
}
/**
Modified: incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/ImplHelper.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/ImplHelper.java?view=diff&rev=508395&r1=508394&r2=508395
==============================================================================
--- incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/ImplHelper.java (original)
+++ incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/ImplHelper.java Fri Feb 16 05:52:08 2007
@@ -20,8 +20,8 @@
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
+import java.util.Map;
-import org.apache.commons.lang.StringUtils;
import org.apache.openjpa.enhance.PersistenceCapable;
import org.apache.openjpa.kernel.FetchConfiguration;
import org.apache.openjpa.kernel.LockManager;
@@ -30,7 +30,10 @@
import org.apache.openjpa.kernel.StoreContext;
import org.apache.openjpa.kernel.StoreManager;
import org.apache.openjpa.lib.util.Closeable;
+import org.apache.openjpa.lib.util.ReferenceMap;
import org.apache.openjpa.lib.util.UUIDGenerator;
+import org.apache.openjpa.lib.util.concurrent.ConcurrentHashMap;
+import org.apache.openjpa.lib.util.concurrent.ConcurrentReferenceHashMap;
import org.apache.openjpa.meta.ClassMetaData;
import org.apache.openjpa.meta.FieldMetaData;
import org.apache.openjpa.meta.JavaTypes;
@@ -46,6 +49,10 @@
*/
public class ImplHelper {
+ // Cache for from/to type assignments
+ private static ConcurrentReferenceHashMap _assignableTypes =
+ new ConcurrentReferenceHashMap(ReferenceMap.WEAK, ReferenceMap.HARD);
+
/**
* Helper for store manager implementations. This method simply delegates
* to the proper singular method for each state manager.
@@ -186,5 +193,35 @@
*/
public static boolean isManageable(Object instance) {
return instance instanceof PersistenceCapable;
+ }
+
+ /**
+ * Returns true if the referenced "to" class is assignable to the "from"
+ * class. This helper method utilizes a cache to help avoid the overhead
+ * of the Class.isAssignableFrom() method.
+ *
+ * @param from target class instance to be checked for assignability
+ * @param to second class instance to be checked for assignability
+ * @return true if the "to" class is assignable to the "from" class
+ */
+ public static boolean isAssignable(Class from, Class to) {
+ Boolean isAssignable = null;
+ if (from == null || to == null)
+ return false;
+ Map assignableTo = (Map) _assignableTypes.get(from);
+
+ if (assignableTo == null) { // "to" cache doesn't exist, so create it...
+ assignableTo = new ConcurrentHashMap();
+ _assignableTypes.put(from, assignableTo);
+ } else { // "to" cache exists...
+ isAssignable = (Boolean) assignableTo.get(to);
+ }
+
+ if (isAssignable == null) {// we don't have a record of this pair...
+ isAssignable = new Boolean(from.isAssignableFrom(to));
+ assignableTo.put(to, isAssignable);
+ }
+
+ return isAssignable.booleanValue();
}
}
Modified: incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/OpenJPAId.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/OpenJPAId.java?view=diff&rev=508395&r1=508394&r2=508395
==============================================================================
--- incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/OpenJPAId.java (original)
+++ incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/OpenJPAId.java Fri Feb 16 05:52:08 2007
@@ -17,7 +17,6 @@
import java.io.Serializable;
-import org.apache.openjpa.lib.util.ReferenceHashSet;
import org.apache.openjpa.lib.util.ReferenceMap;
import org.apache.openjpa.lib.util.concurrent.ConcurrentReferenceHashMap;
@@ -37,7 +36,7 @@
private transient int _typeHash = 0;
// cache the types' generated hashcodes
private static ConcurrentReferenceHashMap _typeCache =
- new ConcurrentReferenceHashMap(ReferenceMap.HARD, ReferenceMap.WEAK);
+ new ConcurrentReferenceHashMap(ReferenceMap.WEAK, ReferenceMap.HARD);
protected OpenJPAId() {
}