Top Description Inners Fields Constructors Methods
org.hibernate.id.enhanced

public Class HiLoOptimizer

extends AbstractOptimizer
Class Inheritance
Imports
java.io.Serializable, java.util.Map, java.util.concurrent.ConcurrentHashMap, java.util.concurrent.locks.Lock, .ReentrantLock, org.hibernate.HibernateException, org.hibernate.id.IntegralDataTypeHolder, org.jboss.logging.Logger

Optimizer which applies a 'hilo' algorithm in memory to achieve optimization.

A 'hilo' algorithm is simply a means for a single value stored in the database to represent a "bucket" of possible, contiguous values. The database value identifies which particular bucket we are on.

This database value must be paired with another value that defines the size of the bucket; the number of possible values available. The incrementSize serves this purpose. The naming here is meant more for consistency in that this value serves the same purpose as the increment supplied to the PooledOptimizer.

The general algorithms used to determine the bucket is:

  1. upperLimit = (databaseValue * incrementSize) + 1
  2. lowerLimit = upperLimit - incrementSize

As an example, consider a case with incrementSize of 20. Initially, the database holds 1:

  1. upperLimit = (1 * 20) + 1 = 21
  2. lowerLimit = 21 - 20 = 1

From there we increment the value from lowerLimit until we reach the upperLimit, at which point we would define a new bucket. The database now contains 2, though incrementSize remains unchanged:

  1. upperLimit = (2 * 20) + 1 = 41
  2. lowerLimit = 41 - 20 = 21
And so on...

Note, 'value' always (after init) holds the next value to return

Author
Steve Ebersole

Nested and Inner Type Summary

Modifier and TypeClass and Description
private static class

Field Summary

Modifier and TypeField and Description
private final Lock
lock

Use a lock instead of the monitor lock to avoid pinning when using virtual threads.

private static final Logger
private HiLoOptimizer.GenerationState
private Map<String, HiLoOptimizer.GenerationState>
Inherited from org.hibernate.id.enhanced.AbstractOptimizer:
incrementSizereturnClass

Constructor Summary

AccessConstructor and Description
public
HiLoOptimizer(Class<?>
The Java type of the values to be generated
returnClass
,
int
The increment size.
incrementSize
)

Constructs a HiLoOptimizer

Method Summary

Modifier and TypeMethod and Description
public boolean
applyIncrementSizeToSourceValues()

Implements org.hibernate.id.enhanced.Optimizer.applyIncrementSizeToSourceValues.

Are increments to be applied to the values stored in the underlying value source?
public Serializable
generate(AccessCallback
Callback to access the underlying value source.
callback
)

Implements org.hibernate.id.enhanced.Optimizer.generate.

Generate an identifier value accounting for this specific optimization.
public IntegralDataTypeHolder

Returns:

Value for property 'upperLimit'.
getHiValue
()

Getter for property 'upperLimit'.

public IntegralDataTypeHolder
getLastSourceValue()

Implements org.hibernate.id.enhanced.Optimizer.getLastSourceValue.

A common means to access the last value obtained from the underlying source.
public IntegralDataTypeHolder

Returns:

Value for property 'lastValue'.
getLastValue
()

Getter for property 'lastValue'.

private HiLoOptimizer.GenerationState
locateGenerationState(String tenantIdentifier)

private HiLoOptimizer.GenerationState
Inherited from org.hibernate.id.enhanced.AbstractOptimizer:
getIncrementSizegetReturnClass

Field Detail

lockback to summary
private final Lock lock

Use a lock instead of the monitor lock to avoid pinning when using virtual threads.

logback to summary
private static final Logger log
noTenantStateback to summary
private HiLoOptimizer.GenerationState noTenantState
tenantSpecificStateback to summary
private Map<String, HiLoOptimizer.GenerationState> tenantSpecificState

Constructor Detail

HiLoOptimizerback to summary
public HiLoOptimizer(Class<?> returnClass, int incrementSize)

Constructs a HiLoOptimizer

Parameters
returnClass:Class<?>

The Java type of the values to be generated

incrementSize:int

The increment size.

Method Detail

applyIncrementSizeToSourceValuesback to summary
public boolean applyIncrementSizeToSourceValues()

Implements org.hibernate.id.enhanced.Optimizer.applyIncrementSizeToSourceValues.

Doc from org.hibernate.id.enhanced.Optimizer.applyIncrementSizeToSourceValues.

Are increments to be applied to the values stored in the underlying value source?

Returns:boolean

True if the values in the source are to be incremented according to the defined increment size; false otherwise, in which case the increment is totally an in memory construct.

Annotations
@Override
generateback to summary
public Serializable generate(AccessCallback callback)

Implements org.hibernate.id.enhanced.Optimizer.generate.

Doc from org.hibernate.id.enhanced.Optimizer.generate.

Generate an identifier value accounting for this specific optimization. All known implementors are synchronized. Consider carefully if a new implementation could drop this requirement.

Parameters
callback:AccessCallback

Callback to access the underlying value source.

Returns:Serializable

The generated identifier value.

Annotations
@Override
getHiValueback to summary
public IntegralDataTypeHolder getHiValue()

Getter for property 'upperLimit'.

Exposure intended for testing purposes.

Returns:IntegralDataTypeHolder

Value for property 'upperLimit'.

getLastSourceValueback to summary
public IntegralDataTypeHolder getLastSourceValue()

Implements org.hibernate.id.enhanced.Optimizer.getLastSourceValue.

Doc from org.hibernate.id.enhanced.Optimizer.getLastSourceValue.

A common means to access the last value obtained from the underlying source. This is intended for testing purposes, since accessing the underlying database source directly is much more difficult.

Returns:IntegralDataTypeHolder

The last value we obtained from the underlying source; null indicates we have not yet consulted with the source.

Annotations
@Override
getLastValueback to summary
public IntegralDataTypeHolder getLastValue()

Getter for property 'lastValue'.

Exposure intended for testing purposes.

Returns:IntegralDataTypeHolder

Value for property 'lastValue'.

locateGenerationStateback to summary
private HiLoOptimizer.GenerationState locateGenerationState(String tenantIdentifier)
noTenantGenerationStateback to summary
private HiLoOptimizer.GenerationState noTenantGenerationState()
org.hibernate.id.enhanced back to summary

private Class HiLoOptimizer.GenerationState

extends Object
Class Inheritance

Field Summary

Modifier and TypeField and Description
private IntegralDataTypeHolder
private IntegralDataTypeHolder
private IntegralDataTypeHolder

Constructor Summary

AccessConstructor and Description
private

Method Summary

Inherited from java.lang.Object:
cloneequalsfinalizegetClasshashCodenotifynotifyAlltoStringwaitwaitwait

Field Detail

lastSourceValueback to summary
private IntegralDataTypeHolder lastSourceValue
upperLimitback to summary
private IntegralDataTypeHolder upperLimit
valueback to summary
private IntegralDataTypeHolder value

Constructor Detail

GenerationStateback to summary
private GenerationState()