[hibernate-issues] [Hibernate-JIRA] Commented: (HHH-3628) Hilo optimizer problem in case of multiple threads accessing the sequence table

Montagnon Cyril (JIRA) noreply at atlassian.com
Thu Dec 4 07:09:16 EST 2008


    [ http://opensource.atlassian.com/projects/hibernate/browse/HHH-3628?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=31879#action_31879 ] 

Montagnon Cyril commented on HHH-3628:
--------------------------------------

No probIem Tara and thank you for your comments!

1) I am using the new generators (org.hibernate.id.enhanced.TableGenerator) with the "Pooled" optimizer (org.hibernate.id.enhanced.OptimizerFactory$PooledOptimizer). 
I was just saying that Steve doesn't recommend not using it. Am I wrong?

In my first post, I was reporting that the org.hibernate.id.enhanced.OptimizerFactory$HiLoOptimizer doesn't work

2) regarding the Pooled HHH-3608 issue, I don't understand "A fix that works for multiple JVMs would be to invoke the "callback.getNextValue()" maximum once per "optimizer.generate()" call:"

According to me, 'callback.getNextValue()' can't be called twice per 'optimizer.generate()' call  in the following code  :

public synchronized Serializable generate(AccessCallback callback) {
if ( hiValue < 0 ) {
value = callback.getNextValue();
if ( value < 1 ) {
// unfortunately not really safe to normalize this
// to 1 as an initial value like we do the others
// because we would not be able to control this if
// we are using a sequence...
log.info( "pooled optimizer source reported [" + value + "] as the initial value; use of 1 or greater highly recommended" );
}
hiValue = callback.getNextValue();
}
else if ( value >= hiValue ) {
hiValue = callback.getNextValue();
value = hiValue - incrementSize;
}
return make( value++ );
} 

> Hilo optimizer problem in case of multiple threads accessing the sequence table
> -------------------------------------------------------------------------------
>
>                 Key: HHH-3628
>                 URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-3628
>             Project: Hibernate Core
>          Issue Type: Bug
>    Affects Versions: 3.2.6
>         Environment: Sybase
>            Reporter: Montagnon Cyril
>
> If 2 (or more) threads access the table storing the ids, this optimizer won't work and will try to insert entities with twice the same idea.
> The problem is the way the HiLoOptimizer class generates the id : 
>             public synchronized Serializable generate(AccessCallback callback) {
> 			if ( lastSourceValue < 0 ) {
> 				lastSourceValue = callback.getNextValue();
> 				while ( lastSourceValue <= 0 ) {
> 					lastSourceValue = callback.getNextValue();
> 				}
> 				hiValue = ( lastSourceValue * incrementSize ) + 1;
> 				value = hiValue - incrementSize;
> 			}
> 			else if ( value >= hiValue ) {
> 				lastSourceValue = callback.getNextValue();
> 				hiValue = ( lastSourceValue * incrementSize ) + 1;
> 			}
> 			return make( value++ );
> 		}
> In the 'else if' part, the 'value' variable isn't reaffected, which means the current thread will try to insert entities with an id that has already been used by another thread. The value should be reset with hiValue - incrementSize.

-- 
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