Hello,

   We get the following exception when stressing a database from two 
different processes with FILE_LOCK=SERIALIZED

Exception in thread "main" javax.persistence.PersistenceException: 
org.hibernate.exception.GenericJDBCException: could not get next sequence 
value
        at 
org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1387)
        at 
org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1315)
        at 
org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1321)
        at 
org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:843)
        at fr.harvest.big.dao.BigDao.create(BigDao.java:217)
        at 
fr.harvest.big.direct.BigPersistDirect.putEntity(BigPersistDirect.java:193)
        at 
fr.harvest.big.direct.BigPersistDirect.putSession(BigPersistDirect.java:315)
        at 
fr.harvest.big.common.BigPersist.acquireSession(BigPersist.java:250)
Caused by: org.hibernate.exception.GenericJDBCException: could not get next 
sequence value
        at 
org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:140)
        at 
org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:128)
        at 
org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
        at 
org.hibernate.id.SequenceGenerator.generateHolder(SequenceGenerator.java:132)
        at 
org.hibernate.id.SequenceHiLoGenerator.generate(SequenceHiLoGenerator.java:78)
        at 
org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:121)
        at 
org.hibernate.ejb.event.EJB3PersistEventListener.saveWithGeneratedId(EJB3PersistEventListener.java:69)
        at 
org.hibernate.event.def.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:179)
        at 
org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:135)
        at 
org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:61)
        at org.hibernate.impl.SessionImpl.firePersist(SessionImpl.java:808)
        at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:782)
        at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:786)
        at 
org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:837)
        ... 4 more
Caused by: org.h2.jdbc.JdbcSQLException: General error: 
"java.lang.RuntimeException: Unexpected code path" [50000-161]
        at 
org.h2.message.DbException.getJdbcSQLException(DbException.java:329)
        at org.h2.message.DbException.get(DbException.java:158)
        at org.h2.message.DbException.convert(DbException.java:281)
        at org.h2.message.DbException.toSQLException(DbException.java:254)
        at org.h2.message.TraceObject.logAndConvert(TraceObject.java:368)
        at 
org.h2.jdbc.JdbcPreparedStatement.executeQuery(JdbcPreparedStatement.java:104)
        at 
com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:76)
        at 
org.hibernate.id.SequenceGenerator.generateHolder(SequenceGenerator.java:112)
        ... 14 more
Caused by: java.lang.RuntimeException: Unexpected code path
        at 
org.h2.message.DbException.throwInternalError(DbException.java:228)
        at 
org.h2.message.DbException.throwInternalError(DbException.java:241)
        at *org.h2.engine.Database.afterWriting(Database.java:2269)*
        at org.h2.command.Command.executeQuery(Command.java:199)
        at 
org.h2.jdbc.JdbcPreparedStatement.executeQuery(JdbcPreparedStatement.java:96)
        ... 16 more

As far as I can understand it, the H2 engine is executing some code that 
should never be reached.
    public void afterWriting() {
        if (fileLockMethod != FileLock.LOCK_SERIALIZED) {
            return;
        }
        synchronized (reconnectSync) {
            checkpointAllowed--;
        }
        if (SysProperties.CHECK && checkpointAllowed < 0) {
            throw DbException.throwInternalError();
        }
    }

I was wondering if it wouldn't be safer to check the checkpointAllowed 
field inside the synchronized section but this may not be the explanation.

We're trying to get some sample code to reproduce without our whole 
application (which uses hibernate, c3p0, ...) in order to provide it.
However, meanwhile, any help on that topic would be much appreciated.

-- 
You received this message because you are subscribed to the Google Groups "H2 
Database" group.
To view this discussion on the web visit 
https://groups.google.com/d/msg/h2-database/-/7QBeByzJThcJ.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/h2-database?hl=en.

Reply via email to