| When using a sequence ID generator with MySQL Dialect, it seems to be possible to get the system to lock up completely. This behaviour is triggered if a large number of threads are all creating entities in the table with the sequence generator at the same time. After poring over stack traces, the problem seems to be as follows:
The relevant portion of the stack trace seems to be: ``` at sun.misc.Unsafe.park(boolean, long) at java.util.concurrent.locks.LockSupport.park(java.lang.Object) (line: 175) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await() (line: 2039) at org.apache.commons.pool2.impl.LinkedBlockingDeque.takeFirst() (line: 583) at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(long) (line: 442) at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject() (line: 363) at org.apache.commons.dbcp2.PoolingDataSource.getConnection() (line: 134) at org.apache.commons.dbcp2.BasicDataSource.getConnection() (line: 1533) at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection() (line: 122) at org.hibernate.internal.NonContextualJdbcConnectionAccess.obtainConnection() (line: 35) at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcIsolationDelegate.delegateWork(org.hibernate.jdbc.WorkExecutorVisitable, boolean) (line: 48) at org.hibernate.id.enhanced.TableStructure$1.getNextValue() (line: 125) at org.hibernate.id.enhanced.PooledOptimizer.generate(org.hibernate.id.enhanced.AccessCallback) (line: 73) at org.hibernate.id.enhanced.SequenceStyleGenerator.generate(org.hibernate.engine.spi.SharedSessionContractImplementor, java.lang.Object) (line: 432) at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(java.lang.Object, java.lang.String, java.lang.Object, org.hibernate.event.spi.EventSource, boolean) (line: 105) at org.hibernate.jpa.event.internal.core.JpaPersistEventListener.saveWithGeneratedId(java.lang.Object, java.lang.String, java.lang.Object, org.hibernate.event.spi.EventSource, boolean) (line: 67) ``` I guess the question on my mind is why does this operation need to proceed in a separate connection? That just seems ripe for this kind of deadlock. |