This is a generic machine for pre-allocating ranges of sequence numbers in order to improve concurrency. The public methods are synchronized and should be brief. The caller of the methods in this class is responsible for updating values on disk when the generator is exhausted or when it needs to allocate a new range of values.
The most used method in this class is getCurrentValueAndAdvance(). This method returns the next number in the range managed by the sequence generator. This method will raise an exception if the sequence generator is exhausted. Otherwise getCurrentValueAndAdvance() hands back a tuple of return values:
( status, currentValue, lastAllocatedValue, numberOfValuesAllocated )
The status field takes the following values:
It may happen that getCurrentValueAndAdvance() tells its caller to allocate a new range of sequence numbers in the system catalog. If the caller successfully allocates a new range, the caller should call allocateNewRange() to tell the generator to update its internal memory of that range.
The peekAtCurrentValue() method is provided so that unused, pre-allocated values can be flushed when the sequence generator is being discarded. The caller updates the catalog with the value returned by peekAtCurrentValue(). The peekAtCurrentValue() method is also called by the syscs_peek_at_sequence() function which users should call rather than try to scan the underlying catalog themselves.
| Modifier and Type | Field and Description |
|---|---|
| private final boolean | |
| private long | |
| private final long | |
| private boolean | |
| private final long | |
| private final long | |
| private final SequencePreallocator | |
| private long | |
| private final long | |
| private final String | |
| private final String | |
| private final boolean | |
| public static final int | |
| public static final int | |
| public static final int | |
| public static final int | |
| public static final int | |
| private static final int | PREALLOCATION_THRESHHOLD
If pre-allocation drops below this level, then we need to grab another chunk of numbers |
| public static final int | |
| public static final int | |
| public static final int | |
| public static final int |
| Access | Constructor and Description |
|---|---|
| public | SequenceGenerator(Long currentValue, boolean canCycle, long increment, long maxValue, long minValue, long restartValue, String schemaName, String sequenceName, SequencePreallocator sequencePreallocator)
Normal constructor |
| Modifier and Type | Method and Description |
|---|---|
| private void | advanceValue(long[]
Array of return values to fill in: see CVAA_* constants retval)Advance the sequence generator. |
| public synchronized void | |
| public synchronized SequenceGenerator | clone(boolean
True if the clone should be reset to start at the beginning instead of at the current value. restart)Clone this sequence generator. |
| public synchronized SequenceGenerator | |
| private void | computeNewAllocation(long
INPUT Used to compute how many values need to be allocated oldCurrentValue, long[] OUTPUT Array of values to fill in (see CVAA_* constants) retval)Compute the number of values to allocate. |
| private int | computePreAllocationCount()
This method returns the number of values to pre-allocate when we grab a new chunk of values. |
| private long | computeRemainingValues(long oldCurrentValue)
Get the number of values remaining until we bump against an endpoint of the legal range of values. |
| public synchronized long[] | Returns: Returns an array of longs indexed by the CVAA_* constants.Get the next sequence number managed by this generator and advance the number. |
| public synchronized String | |
| public synchronized String | |
| private void | |
| private boolean | overflowed(long originalValue, long incrementedValue)
Return true if an overflow/underflow occurred. |
| public synchronized Long | peekAtCurrentValue()
Peek at the current value of the sequence generator without advancing the generator. |
| _CAN_CYCLE | back to summary |
|---|---|
| private final boolean _CAN_CYCLE | |
| _currentValue | back to summary |
|---|---|
| private long _currentValue | |
| _INCREMENT | back to summary |
|---|---|
| private final long _INCREMENT | |
| _isExhausted | back to summary |
|---|---|
| private boolean _isExhausted | |
| _MAX_VALUE | back to summary |
|---|---|
| private final long _MAX_VALUE | |
| _MIN_VALUE | back to summary |
|---|---|
| private final long _MIN_VALUE | |
| _PREALLOCATOR | back to summary |
|---|---|
| private final SequencePreallocator _PREALLOCATOR | |
| _remainingPreallocatedValues | back to summary |
|---|---|
| private long _remainingPreallocatedValues | |
| _RESTART_VALUE | back to summary |
|---|---|
| private final long _RESTART_VALUE | |
| _SCHEMA_NAME | back to summary |
|---|---|
| private final String _SCHEMA_NAME | |
| _SEQUENCE_NAME | back to summary |
|---|---|
| private final String _SEQUENCE_NAME | |
| _STEP_INCREASES | back to summary |
|---|---|
| private final boolean _STEP_INCREASES | |
| CVAA_CURRENT_VALUE | back to summary |
|---|---|
| public static final int CVAA_CURRENT_VALUE | |
| CVAA_LAST_ALLOCATED_VALUE | back to summary |
|---|---|
| public static final int CVAA_LAST_ALLOCATED_VALUE | |
| CVAA_LENGTH | back to summary |
|---|---|
| public static final int CVAA_LENGTH | |
| CVAA_NUMBER_OF_VALUES_ALLOCATED | back to summary |
|---|---|
| public static final int CVAA_NUMBER_OF_VALUES_ALLOCATED | |
| CVAA_STATUS | back to summary |
|---|---|
| public static final int CVAA_STATUS | |
| PREALLOCATION_THRESHHOLD | back to summary |
|---|---|
| private static final int PREALLOCATION_THRESHHOLD If pre-allocation drops below this level, then we need to grab another chunk of numbers | |
| RET_ALLOCATE_NEW_VALUES | back to summary |
|---|---|
| public static final int RET_ALLOCATE_NEW_VALUES | |
| RET_I_AM_CONFUSED | back to summary |
|---|---|
| public static final int RET_I_AM_CONFUSED | |
| RET_MARK_EXHAUSTED | back to summary |
|---|---|
| public static final int RET_MARK_EXHAUSTED | |
| RET_OK | back to summary |
|---|---|
| public static final int RET_OK | |
| SequenceGenerator | back to summary |
|---|---|
| public SequenceGenerator(Long currentValue, boolean canCycle, long increment, long maxValue, long minValue, long restartValue, String schemaName, String sequenceName, SequencePreallocator sequencePreallocator) Normal constructor | |
| advanceValue | back to summary |
|---|---|
| private void advanceValue(long[] retval) throws StandardException Advance the sequence generator. Pre-allocate a range of new values if necessary.
| |
| allocateNewRange | back to summary |
|---|---|
| public synchronized void allocateNewRange(long expectedCurrentValue, long numberOfAllocatedValues) Allocate a new range. Is a NOP if the current value is not what we expected. See the class header comment for more information on how this method is used. | |
| clone | back to summary |
|---|---|
| public synchronized SequenceGenerator clone(boolean restart) Clone this sequence generator. This method supports the special bulk-insert optimization in InsertResultSet.
| |
| clone | back to summary |
|---|---|
| public synchronized SequenceGenerator clone(Long newStartValue) Clone this sequence generator. This method supports the special bulk-insert optimization in InsertResultSet.
| |
| computeNewAllocation | back to summary |
|---|---|
| private void computeNewAllocation(long oldCurrentValue, long[] retval) throws StandardException Compute the number of values to allocate. The range may wrap around.
| |
| computePreAllocationCount | back to summary |
|---|---|
| private int computePreAllocationCount() This method returns the number of values to pre-allocate when we grab a new chunk of values. This is a bit of defensive coding to cover the case when the sequence's parameters are absurdly large. | |
| computeRemainingValues | back to summary |
|---|---|
| private long computeRemainingValues(long oldCurrentValue) Get the number of values remaining until we bump against an endpoint of the legal range of values. This is a positive number and so may understate the number of remaining values if the datatype is BIGINT. | |
| getCurrentValueAndAdvance | back to summary |
|---|---|
| public synchronized long[] getCurrentValueAndAdvance() throws StandardException Get the next sequence number managed by this generator and advance the number. Could raise an exception if the legal range is exhausted and wrap-around is not allowed--that is, if NO CYCLE was specified when the sequence was defined. See the class header comment for a description of how this method operates.
| |
| getName | back to summary |
|---|---|
| public synchronized String getName() Get the name of this sequence generator. Technically, this doesn't need to be synchronized. But it is simpler to just maintain a rule that all public methods should be synchronized. | |
| getSchemaName | back to summary |
|---|---|
| public synchronized String getSchemaName() Get the name of the schema of this sequence generator. Technically, this doesn't need to be synchronized. But it is simpler to just maintain a rule that all public methods should be synchronized. | |
| markExhausted | back to summary |
|---|---|
| private void markExhausted(long[] retval) Mark the generator as exhausted. | |
| overflowed | back to summary |
|---|---|
| private boolean overflowed(long originalValue, long incrementedValue) Return true if an overflow/underflow occurred. This happens if the originalValue and incrementedValue have opposite sign. Overflow also occurs if the incrementedValue falls outside the range of the sequence. | |
| peekAtCurrentValue | back to summary |
|---|---|
| public synchronized Long peekAtCurrentValue() Peek at the current value of the sequence generator without advancing the generator. Returns null if the generator is exhausted. | |