diff --git a/hibernate-core/src/main/java/org/hibernate/id/enhanced/PooledLoThreadLocalOptimizer.java b/hibernate-core/src/main/java/org/hibernate/id/enhanced/PooledLoThreadLocalOptimizer.java index 307629c227..ead2222275 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/enhanced/PooledLoThreadLocalOptimizer.java +++ b/hibernate-core/src/main/java/org/hibernate/id/enhanced/PooledLoThreadLocalOptimizer.java @@ -31,15 +31,6 @@ public class PooledLoThreadLocalOptimizer extends AbstractOptimizer { PooledLoOptimizer.class.getName() ); - private static class GenerationState { - // last value read from db source - private IntegralDataTypeHolder lastSourceValue; - // the current generator value - private IntegralDataTypeHolder value; - // the value at which we'll hit the db again - private IntegralDataTypeHolder upperLimitValue; - } - private final ThreadLocal singleTenantState = ThreadLocal.withInitial( GenerationState::new ); private final ThreadLocal> multiTenantStates = ThreadLocal.withInitial( HashMap::new ); @@ -59,22 +50,8 @@ public class PooledLoThreadLocalOptimizer extends AbstractOptimizer { @Override public Serializable generate(AccessCallback callback) { - final GenerationState generationState = locateGenerationState( callback.getTenantIdentifier() ); - return generate( generationState, callback ); - } - - private Serializable generate(GenerationState generationState, AccessCallback callback) { - if ( generationState.value == null - || !generationState.value.lt( generationState.upperLimitValue ) ) { - generationState.lastSourceValue = callback.getNextValue(); - generationState.upperLimitValue = generationState.lastSourceValue.copy().add( incrementSize ); - generationState.value = generationState.lastSourceValue.copy(); - // handle cases where initial-value is less that one (hsqldb for instance). - while ( generationState.value.lt( 1 ) ) { - generationState.value.increment(); - } - } - return generationState.value.makeValueThenIncrement(); + return locateGenerationState( callback.getTenantIdentifier() ) + .generate( callback, incrementSize ); } private GenerationState locateGenerationState(String tenantIdentifier) { @@ -112,4 +89,26 @@ public class PooledLoThreadLocalOptimizer extends AbstractOptimizer { public boolean applyIncrementSizeToSourceValues() { return true; } + + private static class GenerationState { + // last value read from db source + private IntegralDataTypeHolder lastSourceValue; + // the current generator value + private IntegralDataTypeHolder value; + // the value at which we'll hit the db again + private IntegralDataTypeHolder upperLimitValue; + + private Serializable generate(AccessCallback callback, int incrementSize) { + if ( value == null || !value.lt( upperLimitValue ) ) { + lastSourceValue = callback.getNextValue(); + upperLimitValue = lastSourceValue.copy().add( incrementSize ); + value = lastSourceValue.copy(); + // handle cases where initial-value is less that one (hsqldb for instance). + while ( value.lt( 1 ) ) { + value.increment(); + } + } + return value.makeValueThenIncrement(); + } + } }