Author: cbegin
Date: Mon May 18 05:33:18 2009
New Revision: 775817

URL: http://svn.apache.org/viewvc?rev=775817&view=rev
Log:
implemented cross transaction lazy loading

Modified:
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/BaseExecutor.java
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/CachingExecutor.java
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/Executor.java
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/loader/ResultLoader.java
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/resultset/DefaultResultSetHandler.java

Modified: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/BaseExecutor.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/BaseExecutor.java?rev=775817&r1=775816&r2=775817&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/BaseExecutor.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/BaseExecutor.java
 Mon May 18 05:33:18 2009
@@ -15,19 +15,21 @@
 
   private static final Object EXECUTION_PLACEHOLDER = new Object();
 
-  protected final Transaction transaction;
+  protected Transaction transaction;
 
-  protected final List<DeferredLoad> deferredLoads;
-  protected final PerpetualCache localCache;
+  protected List<DeferredLoad> deferredLoads;
+  protected PerpetualCache localCache;
 
   protected int queryStack = 0;
 
   protected List<BatchResult> batchResults = new ArrayList<BatchResult>();
+  private boolean closed;
 
   protected BaseExecutor(Transaction transaction) {
     this.transaction = transaction;
     this.deferredLoads = new ArrayList<DeferredLoad>();
     this.localCache = new PerpetualCache("LocalCache");
+    this.closed = false;
   }
 
   public Transaction getTransaction() {
@@ -39,9 +41,19 @@
       transaction.close();
     } catch (SQLException e) {
       // Ignore.  There's nothing that can be done at this point.
+    } finally {
+      transaction = null;
+      deferredLoads = null;
+      localCache = null;
+      batchResults = null;
+      closed = true;
     }
   }
 
+  public boolean isClosed() {
+    return closed;
+  }
+
   public int update(MappedStatement ms, Object parameter) throws SQLException {
     ErrorContext.instance().resource(ms.getResource()).activity("executing an 
update").object(ms.getId());
     localCache.clear();

Modified: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/CachingExecutor.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/CachingExecutor.java?rev=775817&r1=775816&r2=775817&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/CachingExecutor.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/CachingExecutor.java
 Mon May 18 05:33:18 2009
@@ -26,6 +26,10 @@
     delegate.close();
   }
 
+  public boolean isClosed() {
+    return delegate.isClosed();
+  }
+
   public int update(MappedStatement ms, Object parameterObject) throws 
SQLException {
     flushCacheIfRequired(ms);
     return delegate.update(ms, parameterObject);

Modified: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/Executor.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/Executor.java?rev=775817&r1=775816&r2=775817&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/Executor.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/Executor.java
 Mon May 18 05:33:18 2009
@@ -35,4 +35,6 @@
 
   void close();
 
+  boolean isClosed();
+
 }

Modified: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/loader/ResultLoader.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/loader/ResultLoader.java?rev=775817&r1=775816&r2=775817&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/loader/ResultLoader.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/loader/ResultLoader.java
 Mon May 18 05:33:18 2009
@@ -2,8 +2,15 @@
 
 import org.apache.ibatis.executor.*;
 import org.apache.ibatis.mapping.MappedStatement;
+import org.apache.ibatis.mapping.Configuration;
+import org.apache.ibatis.mapping.Environment;
+import org.apache.ibatis.mapping.ExecutorType;
+import org.apache.ibatis.transaction.TransactionFactory;
+import org.apache.ibatis.transaction.Transaction;
 
+import javax.sql.DataSource;
 import java.sql.SQLException;
+import java.sql.Connection;
 import java.util.*;
 
 public class ResultLoader {
@@ -11,6 +18,7 @@
   protected static final Class[] LIST_INTERFACES = new Class[]{List.class};
   protected static final Class[] SET_INTERFACES = new Class[]{Set.class};
 
+  protected final Configuration configuration;
   protected final Executor executor;
   protected final MappedStatement mappedStatement;
   protected final Object parameterObject;
@@ -19,7 +27,8 @@
   protected boolean loaded;
   protected Object resultObject;
 
-  public ResultLoader(Executor executor, MappedStatement mappedStatement, 
Object parameterObject, Class targetType) {
+  public ResultLoader(Configuration config, Executor executor, MappedStatement 
mappedStatement, Object parameterObject, Class targetType) {
+    this.configuration = config;
     this.executor = executor;
     this.mappedStatement = mappedStatement;
     this.parameterObject = parameterObject;
@@ -27,7 +36,7 @@
   }
 
   public Object loadResult() throws SQLException {
-    List list = executor.query(mappedStatement, parameterObject, 
Executor.NO_ROW_OFFSET, Executor.NO_ROW_LIMIT, Executor.NO_RESULT_HANDLER);
+    List list = selectListFromNewExecutor();
     if (targetType != null && Set.class.isAssignableFrom(targetType)) {
       resultObject = new HashSet(list);
     } else if (targetType != null && 
Collection.class.isAssignableFrom(targetType)) {
@@ -44,6 +53,32 @@
     return resultObject;
   }
 
+  private List selectListFromNewExecutor() throws SQLException {
+    Executor localExecutor = executor;
+    if (localExecutor.isClosed()) {
+      localExecutor = newExecutor();
+    }
+    try {
+      return localExecutor.query(mappedStatement, parameterObject, 
Executor.NO_ROW_OFFSET, Executor.NO_ROW_LIMIT, Executor.NO_RESULT_HANDLER);
+    } finally {
+      if (executor.isClosed()) {
+        localExecutor.close();
+      }
+    }
+  }
+
+  private Executor newExecutor() throws SQLException {
+    Environment environment = configuration.getEnvironment();
+    if (environment == null) throw new ExecutorException("ResultLoader could 
not load lazily.  Environment was not configured.");
+    TransactionFactory txFactory = environment.getTransactionFactory();
+    if (txFactory == null) throw new ExecutorException("ResultLoader could not 
load lazily.  Transaction Factory was not configured.");
+    DataSource ds = environment.getDataSource();
+    if (ds == null) throw new ExecutorException("ResultLoader could not load 
lazily.  DataSource was not configured.");
+    Connection conn = ds.getConnection();
+    Transaction tx = txFactory.newTransaction(conn, false);
+    return configuration.newExecutor(tx, ExecutorType.SIMPLE);
+  }
+
   public boolean wasNull() {
     return resultObject == null;
   }

Modified: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/resultset/DefaultResultSetHandler.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/resultset/DefaultResultSetHandler.java?rev=775817&r1=775816&r2=775817&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/resultset/DefaultResultSetHandler.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/resultset/DefaultResultSetHandler.java
 Mon May 18 05:33:18 2009
@@ -215,7 +215,7 @@
         if (executor.isCached(nestedQuery, key)) {
           executor.deferLoad(nestedQuery, metaResultObject, 
resultMapping.getProperty(), key);
         } else {
-          ResultLoader resultLoader = new ResultLoader(executor, nestedQuery, 
parameterObject, resultMapping.getJavaType());
+          ResultLoader resultLoader = new ResultLoader(configuration, 
executor, nestedQuery, parameterObject, resultMapping.getJavaType());
           if (lazyLoader == null) {
             value = resultLoader.loadResult();
           } else {


Reply via email to