You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by cu...@apache.org on 2009/12/08 17:53:56 UTC

svn commit: r888481 - in /openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa: conf/Compatibility.java kernel/DetachManager.java

Author: curtisr7
Date: Tue Dec  8 16:53:56 2009
New Revision: 888481

URL: http://svn.apache.org/viewvc?rev=888481&view=rev
Log:
OPENJPA-1414: Performance improvements for detach processing. Patch contributed by Dianne Richards.

Modified:
    openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/Compatibility.java
    openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DetachManager.java

Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/Compatibility.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/Compatibility.java?rev=888481&r1=888480&r2=888481&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/Compatibility.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/Compatibility.java Tue Dec  8 16:53:56 2009
@@ -65,6 +65,7 @@
     private boolean _isAbstractMappingUniDirectional = false;
     private boolean _isNonDefaultMappingAllowed = false;
     private boolean _reorderMetaDataResolution = true;
+    private boolean _reloadOnDetach = false;
     
     /**
      * Whether to require exact identity value types when creating object
@@ -494,4 +495,31 @@
         _reorderMetaDataResolution = reorderProcessBuffer;
     }
 
+    /**
+     * Whether OpenJPA should attempt to load fields when the DetachState
+     * option is set to loaded. This also determines whether a
+     * redundant copy of the version field is made. Beginning in 2.0
+     * it defaults to false.
+     * 
+     * @return the _reloadOnDetach
+     * 
+     * @since 1.2.2
+     */
+    public boolean getReloadOnDetach() {
+        return _reloadOnDetach;
+    }
+
+    /**
+     * Whether OpenJPA should attempt to load fields when the DetachState
+     * option is set to loaded. This also determines whether a
+     * redundant copy of the version field is made. Beginning in 2.0
+     * it defaults to false.
+     * 
+     * @param reloadOnDetach the _reloadOnDetach to set
+     * 
+     * @since 1.2.2
+     */
+    public void setReloadOnDetach(boolean reloadOnDetach) {
+        _reloadOnDetach = reloadOnDetach;
+    }       
 }

Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DetachManager.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DetachManager.java?rev=888481&r1=888480&r2=888481&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DetachManager.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DetachManager.java Tue Dec  8 16:53:56 2009
@@ -70,7 +70,8 @@
     private final boolean _failFast;
     private boolean _flushed = false;
     private boolean _flushBeforeDetach;
-    private boolean _cascadeWithDetach;    
+    private boolean _cascadeWithDetach; 
+    private boolean _reloadOnDetach;
 
     // if we're not detaching full, we need to track all detached objects;
     // if we are, then we use a special field manager for more efficient
@@ -95,7 +96,7 @@
         boolean setState = meta.getDetachedState() != null
             && !ClassMetaData.SYNTHETIC.equals(meta.getDetachedState());
         BitSet idxs = (setState) ? new BitSet(meta.getFields().length) : null;
-        preDetach(sm.getBroker(), sm, idxs);
+        preDetach(sm.getBroker(), sm, idxs, false, true);
 
         if (setState) {
             sm.getPersistenceCapable().pcSetDetachedState(getDetachedState
@@ -123,7 +124,7 @@
         flushDirty(sm);
 
         Broker broker = sm.getBroker();
-        preDetach(broker, sm, idxs);
+        preDetach(broker, sm, idxs, false, true);
 
         // write detached state object and state manager
         DetachOptions opts = broker.getConfiguration().
@@ -148,7 +149,8 @@
      * effect of this method
      */
     private static void preDetach(Broker broker, StateManagerImpl sm,
-        BitSet idxs) {
+        BitSet idxs, boolean full,
+        boolean reloadOnDetach) {
         // make sure the existing object has the right fields fetched; call
         // even if using currently-loaded fields for detach to make sure
         // version is set
@@ -160,8 +162,12 @@
         else if (detachMode == DETACH_ALL)
             loadMode = StateManagerImpl.LOAD_ALL;
         try {
-            sm.load(broker.getFetchConfiguration(), loadMode, exclude, null, 
-                false);
+            if (detachMode != DETACH_LOADED || 
+                    reloadOnDetach ||
+                    (!reloadOnDetach && !full)) {
+                sm.load(broker.getFetchConfiguration(), loadMode, exclude,
+                    null, false);
+            }
         } catch (ObjectNotFoundException onfe) {
             // consume the exception
         }
@@ -280,6 +286,7 @@
         Compatibility compatibility = 
             broker.getConfiguration().getCompatibilityInstance();
         _flushBeforeDetach = compatibility.getFlushBeforeDetach();
+        _reloadOnDetach = compatibility.getReloadOnDetach();
         _cascadeWithDetach = compatibility.getCascadeWithDetach();
         if (full) {
             _copy = false;
@@ -441,7 +448,8 @@
         }
         
         BitSet fields = new BitSet();
-        preDetach(_broker, sm, fields);
+        preDetach(_broker, sm, fields, _full,
+            _reloadOnDetach);
 
         // create and store new object before copy to avoid endless recursion
         PersistenceCapable pc = sm.getPersistenceCapable();
@@ -462,7 +470,9 @@
                 _opts.getAccessUnloaded(), _broker.getMultithreaded());
         if (_full) {
             _fullFM.setStateManager(sm);
-            _fullFM.detachVersion();
+            if (_copy || _reloadOnDetach) {
+                _fullFM.detachVersion();
+            }
             _fullFM.reproxy(detSM);
             _fullFM.setStateManager(null);
         } else {