Skip to content

Commit

Permalink
HHH-14444 Avoid synchronization for single-tenant generation in Poole…
Browse files Browse the repository at this point in the history
…dLoThreadLocalOptimizer

Signed-off-by: Yoann Rodière <yoann@hibernate.org>
  • Loading branch information
yrodiere authored and Sanne committed Feb 9, 2021
1 parent 04a40f8 commit 5c155f3
Showing 1 changed file with 15 additions and 13 deletions.
Expand Up @@ -58,26 +58,28 @@ public PooledLoThreadLocalOptimizer(Class returnClass, int incrementSize) {
public Serializable generate(AccessCallback callback) {
if ( callback.getTenantIdentifier() == null ) {
final GenerationState local = localAssignedIds.get();
if ( local.value != null && local.value.lt( local.upperLimitValue ) ) {
return local.value.makeValueThenIncrement();
}
return generate( local, callback );
}

synchronized (this) {
final GenerationState generationState = locateGenerationState( callback.getTenantIdentifier() );

if ( generationState.lastSourceValue == 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 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 generationState.value.makeValueThenIncrement();
}

private Map<String, GenerationState> tenantSpecificState;
Expand Down

0 comments on commit 5c155f3

Please sign in to comment.