Skip to content

Commit 2c38b6a

Browse files
Optimized ESCopier with Queue instead of ThreadLocal
1 parent afcfb2a commit 2c38b6a

File tree

1 file changed

+43
-8
lines changed

1 file changed

+43
-8
lines changed

spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/support/copier/registering/EclipseSerializerRegisteringCopier.java

Lines changed: 43 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717

1818
import java.util.HashMap;
1919
import java.util.Map;
20+
import java.util.Queue;
21+
import java.util.concurrent.ConcurrentLinkedQueue;
2022
import java.util.function.Supplier;
2123

2224
import org.eclipse.serializer.persistence.binary.types.Binary;
@@ -39,7 +41,8 @@
3941
public class EclipseSerializerRegisteringCopier implements AutoCloseable
4042
{
4143
private static final Logger LOG = LoggerFactory.getLogger(EclipseSerializerRegisteringCopier.class);
42-
private final ThreadLocal<PersistenceManager<Binary>> persistenceManagers;
44+
private final Queue<PersistenceManager<Binary>> persistenceManagers;
45+
private final Supplier<PersistenceManager<Binary>> persistenceManagerSupplier;
4346
private final SupportedChecker supportedChecker;
4447
private final RegisteringWorkingCopyAndOriginal register;
4548

@@ -50,18 +53,38 @@ public EclipseSerializerRegisteringCopier(
5053
{
5154
this.supportedChecker = supportedChecker;
5255
this.register = register;
53-
this.persistenceManagers = ThreadLocal.withInitial(persistenceManagerSupplier);
56+
this.persistenceManagerSupplier = persistenceManagerSupplier;
57+
this.persistenceManagers = new ConcurrentLinkedQueue<>();
58+
}
59+
60+
private PersistenceManager<Binary> ensurePersistenceManager()
61+
{
62+
final PersistenceManager<Binary> readyToUsePersistenceManager = this.persistenceManagers.poll();
63+
if(readyToUsePersistenceManager == null)
64+
{
65+
return this.persistenceManagerSupplier.get();
66+
}
67+
return readyToUsePersistenceManager;
68+
}
69+
70+
private void returnPersistenceManagerForFutureUses(final PersistenceManager<Binary> usedPersistenceManager)
71+
{
72+
this.persistenceManagers.add(usedPersistenceManager);
5473
}
55-
5674

5775
@Override
5876
public void close()
5977
{
60-
this.persistenceManagers.get().objectRegistry().clearAll();
61-
this.persistenceManagers.get().close();
62-
this.persistenceManagers.remove();
78+
PersistenceManager<Binary> usedPersistenceManager = this.persistenceManagers.poll();
79+
do
80+
{
81+
usedPersistenceManager.objectRegistry().clearAll();
82+
usedPersistenceManager.close();
83+
usedPersistenceManager = this.persistenceManagers.poll();
84+
}
85+
while(usedPersistenceManager != null);
6386
}
64-
87+
6588
/**
6689
* Here lies a lot of knowledge about EclipseStore internals.
6790
* <p>
@@ -78,7 +101,19 @@ public void close()
78101
*/
79102
public <T> T copy(final T source)
80103
{
81-
final PersistenceManager<Binary> persistenceManager = this.persistenceManagers.get();
104+
final PersistenceManager<Binary> persistenceManager = this.ensurePersistenceManager();
105+
try
106+
{
107+
return this.copy(source, persistenceManager);
108+
}
109+
finally
110+
{
111+
this.returnPersistenceManagerForFutureUses(persistenceManager);
112+
}
113+
}
114+
115+
private <T> T copy(final T source, final PersistenceManager<Binary> persistenceManager)
116+
{
82117
persistenceManager.objectRegistry().truncateAll();
83118
final BinaryStorer.Default storer = (BinaryStorer.Default)persistenceManager.createStorer();
84119
// Loader erstellen

0 commit comments

Comments
 (0)