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 {