HHH-14444 Encapsulate ID generation in GenerationState for PooledLoThreadLocalOptimizer

This is just a cosmetic change, it doesn't change the behavior at all.

Signed-off-by: Yoann Rodière <yoann@hibernate.org>
This commit is contained in:
Yoann Rodière 2021-02-08 13:31:02 +01:00 committed by Sanne Grinovero
parent 511dda7dee
commit 14e181806f
1 changed files with 24 additions and 25 deletions

View File

@ -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<GenerationState> singleTenantState = ThreadLocal.withInitial( GenerationState::new );
private final ThreadLocal<Map<String, GenerationState>> 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();
}
}
}