diff --git a/ebean-api/src/main/java/io/ebean/bean/PersistenceContext.java b/ebean-api/src/main/java/io/ebean/bean/PersistenceContext.java
index 9d67499d1..33215595a 100644
--- a/ebean-api/src/main/java/io/ebean/bean/PersistenceContext.java
+++ b/ebean-api/src/main/java/io/ebean/bean/PersistenceContext.java
@@ -64,17 +64,6 @@ public interface PersistenceContext {
*/
PersistenceContext forIterate();
- /**
- * Return a new Persistence context during iteration of large query result.
- */
- PersistenceContext forIterateReset();
-
- /**
- * Return true if the persistence context has grown and hit the 'reset limit'
- * during large query iteration.
- */
- boolean resetLimit();
-
/**
* Wrapper on a bean to also indicate if a bean has been deleted.
*
diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/OrmQueryRequest.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/OrmQueryRequest.java
index 85d89ffe2..a56319fd4 100644
--- a/ebean-core/src/main/java/io/ebeaninternal/server/core/OrmQueryRequest.java
+++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/OrmQueryRequest.java
@@ -263,20 +263,6 @@ public final class OrmQueryRequest extends BeanRequest implements SpiOrmQuery
return jsonRead;
}
- /**
- * For iterate queries reset the persistenceContext and loadContext.
- */
- public void flushPersistenceContextOnIterate() {
- if (persistenceContext.resetLimit()) {
- persistenceContext = persistenceContext.forIterateReset();
- loadContext.resetPersistenceContext(persistenceContext);
- if (jsonRead != null) {
- jsonRead.setPersistenceContext(persistenceContext);
- jsonRead.setLoadContext(loadContext);
- }
- }
- }
-
/**
* Get the TransactionContext either explicitly set on the query or
* transaction scoped.
diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryIteratorSimple.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryIteratorSimple.java
index d438ec747..6d183b936 100644
--- a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryIteratorSimple.java
+++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryIteratorSimple.java
@@ -26,7 +26,6 @@ final class CQueryIteratorSimple implements QueryIterator {
public boolean hasNext() {
boolean ret = false;
try {
- request.flushPersistenceContextOnIterate();
ret = cquery.hasNext();
return ret;
} catch (SQLException e) {
diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryIteratorWithBuffer.java b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryIteratorWithBuffer.java
index ad1a924b5..3df436716 100644
--- a/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryIteratorWithBuffer.java
+++ b/ebean-core/src/main/java/io/ebeaninternal/server/query/CQueryIteratorWithBuffer.java
@@ -35,8 +35,6 @@ final class CQueryIteratorWithBuffer implements QueryIterator {
try {
if (buffer.isEmpty() && moreToLoad) {
// load buffer
- request.flushPersistenceContextOnIterate();
-
int i = -1;
while (moreToLoad && ++i < bufferSize) {
if (cquery.hasNext()) {
diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/DefaultPersistenceContext.java b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/DefaultPersistenceContext.java
index 169ca59a3..911c54c47 100644
--- a/ebean-core/src/main/java/io/ebeaninternal/server/transaction/DefaultPersistenceContext.java
+++ b/ebean-core/src/main/java/io/ebeaninternal/server/transaction/DefaultPersistenceContext.java
@@ -25,15 +25,9 @@ import java.util.concurrent.locks.ReentrantLock;
*/
public final class DefaultPersistenceContext implements SpiPersistenceContext {
- /**
- * Map used hold caches. One cache per bean type.
- */
private final HashMap, ClassContext> typeCache = new HashMap<>();
-
private final ReentrantLock lock = new ReentrantLock();
- private int putCount;
-
/**
* Create a new PersistenceContext.
*/
@@ -41,48 +35,15 @@ public final class DefaultPersistenceContext implements SpiPersistenceContext {
}
/**
- * Create as a shallow copy with initial or types that have not been added to.
- */
- private DefaultPersistenceContext(DefaultPersistenceContext parent, boolean initial) {
- for (Map.Entry, ClassContext> entry : parent.typeCache.entrySet()) {
- typeCache.put(entry.getKey(), entry.getValue().copy(initial));
- }
- }
-
- /**
- * Return the initial shallow copy with each ClassContext noting it's initialSize (to detect additions).
+ * Return a PersistenceContext to use for streaming queries.
*/
@Override
public PersistenceContext forIterate() {
- return new DefaultPersistenceContext(this, true);
- }
-
- /**
- * Return a shallow copy including each ClassContext that has had no additions (still at initialSize).
- */
- @Override
- public PersistenceContext forIterateReset() {
- return new DefaultPersistenceContext(this, false);
- }
-
- @Override
- public boolean resetLimit() {
- lock.lock();
- try {
- if (putCount < 100) {
- return false;
- }
- putCount = 0;
- for (ClassContext value : typeCache.values()) {
- if (value.resetLimit()) {
- return true;
- }
- }
- // checking after another 100 puts
- return false;
- } finally {
- lock.unlock();
+ WeakPersistenceContext weak = new WeakPersistenceContext();
+ for (ClassContext value : typeCache.values()) {
+ weak.add(value.rootType, value.deleteSet, value.map);
}
+ return weak;
}
/**
@@ -92,7 +53,6 @@ public final class DefaultPersistenceContext implements SpiPersistenceContext {
public void put(Class> rootType, Object id, Object bean) {
lock.lock();
try {
- putCount++;
classContext(rootType).put(id, bean);
} finally {
lock.unlock();
@@ -103,7 +63,6 @@ public final class DefaultPersistenceContext implements SpiPersistenceContext {
public Object putIfAbsent(Class> rootType, Object id, Object bean) {
lock.lock();
try {
- putCount++;
return classContext(rootType).putIfAbsent(id, bean);
} finally {
lock.unlock();
@@ -232,61 +191,18 @@ public final class DefaultPersistenceContext implements SpiPersistenceContext {
private final Map