[hibernate-issues] [Hibernate-JIRA] Commented: (HHH-3608) DB sequence numbers are not unique when using the pooled SequenceStyleGenerator in multiple JVMs with the same DB
Erwin Vervaet (JIRA)
noreply at atlassian.com
Mon Jan 26 03:35:39 EST 2009
[ http://opensource.atlassian.com/projects/hibernate/browse/HHH-3608?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=32189#action_32189 ]
Erwin Vervaet commented on HHH-3608:
------------------------------------
Note that you can easily plug in a fixed PooledOptimizer like this:
<id name="id" type="long" column="id" access="property">
<generator class="org.hibernate.id.enhanced.SequenceStyleGenerator">
<param name="sequence_name">seq_person</param>
<param name="increment_size">20</param>
<param name="optimizer">my.FixedPooledOptimizer</param>
</generator>
</id>
Where the FixedPooledOptimizer uses the fix propozed above by Adrian Shum.
> DB sequence numbers are not unique when using the pooled SequenceStyleGenerator in multiple JVMs with the same DB
> -----------------------------------------------------------------------------------------------------------------
>
> Key: HHH-3608
> URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-3608
> Project: Hibernate Core
> Issue Type: Bug
> Components: core
> Affects Versions: 3.2.6, 3.3.0.GA, 3.3.0.SP1, 3.3.1
> Environment: Hibernate 3.2.6, Oracle (any version)
> Reporter: Matthias Gommeringer
> Priority: Blocker
> Attachments: PooledOptimizerTest.java
>
>
> We have several Application Servers (=JVMs) running each of them using Hibernate-Objects with the SequenceStyleGenerator+pooled configured. In unpredictable time intervals it happens that hibernate assigns the same ID to two completely different objects which results in a UniqueConstraintViolation exception from the database. Here an example with a description where hibernate fails:
> DB-Sequence setup:
> start=0
> increment=2
> PooledOptimizer.generate() with 2 threads (first assignment of hiValue/value):
> JVM-1 JVM-2
> value=0=callback.nextval
> value=2=callback.nextval
> hiValue=4=callback.nextval
> hiValue=6=callback.nextval
> The problem's cause is in the PooledOptimizer.generate: when it initializes
> the value+hiValue for the first time it invokes callback.nextValue() twice which
> may provide values that do not belong to each other. The reason is that
> between the assignment of "value" and "hiValue" another JVM can retrieve a
> DB sequence value from the callback which leads to an inconsistent "value" and "hiValue"
> relation (see example above).
> A fix that works for multiple JVMs would be to invoke the "callback.getNextValue()" maximum once
> per "optimizer.generate()" call:
> public synchronized Serializable generate(AccessCallback callback) {
> if ( hiValue < 0 ) {
> value = callback.getNextValue();
> hiValue = value + incrementSize;
> }
> else if ( value >= hiValue ) {
> value = callback.getNextValue();
> hiValue = value + incrementSize;
> }
> return make(value++);
> }
> I attached a testcase that prooves the described problem (you can see that the IDs "2" and "3" are assigned two times).
> I would be very thankful if this problem could be fixed very soon since it is a showstopper which
> occurs very unpredictably.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://opensource.atlassian.com/projects/hibernate/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
More information about the hibernate-issues
mailing list