From 6e2712ea49648883f6f647795494a5ecfa7e55c4 Mon Sep 17 00:00:00 2001 From: Rob Bygrave Date: Mon, 16 Oct 2017 22:14:48 +1300 Subject: [PATCH] #1169 - Memory leak - DefaultTransactionThreadLocal holding reference to transaction --- src/main/java/io/ebeaninternal/api/ScopeTrans.java | 2 +- .../java/io/ebeaninternal/server/core/DefaultServer.java | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main/java/io/ebeaninternal/api/ScopeTrans.java b/src/main/java/io/ebeaninternal/api/ScopeTrans.java index 7701ee8a8..0cd93d702 100644 --- a/src/main/java/io/ebeaninternal/api/ScopeTrans.java +++ b/src/main/java/io/ebeaninternal/api/ScopeTrans.java @@ -153,7 +153,7 @@ public class ScopeTrans implements Thread.UncaughtExceptionHandler { } protected void restoreSuspended() { - if (suspendedTransaction != null) { + if (created || suspendedTransaction != null) { // put the previously suspended transaction // back onto the ThreadLocal or equivalent scopeMgr.replace(suspendedTransaction); diff --git a/src/main/java/io/ebeaninternal/server/core/DefaultServer.java b/src/main/java/io/ebeaninternal/server/core/DefaultServer.java index 2e6a8d8f5..8faf65235 100644 --- a/src/main/java/io/ebeaninternal/server/core/DefaultServer.java +++ b/src/main/java/io/ebeaninternal/server/core/DefaultServer.java @@ -779,6 +779,7 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer { newTransaction = false; suspended = t; t = null; + transactionScopeManager.replace(null); } else { // create a new Transaction based on TxType and t @@ -795,13 +796,11 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer { isoLevel = isolation.getLevel(); } t = transactionManager.createTransaction(true, isoLevel); + // note ScopeTrans.onFinally() restores the suspended transaction + transactionScopeManager.replace(t); } } - // replace the current transaction ... ScopeTrans.onFinally() - // has the job of restoring the suspended transaction - transactionScopeManager.replace(t); - return new ScopeTrans(rollbackOnChecked, newTransaction, t, txScope, suspended, transactionScopeManager); }