On 9/30/2011 11:55 AM, Mamta Satoor wrote:
Hi,
I think it will be good for us to have a junit test which will
reliably run into sequence contention problem.
Thank you Mamta!
$ java -Dderby.locks.waitTimeout=3
I think if the locks.waitTimeout is shorter than the deadlock timeout
(default 20) we can't hit a deadlock.
Maybe try setting derby.locks.deadlockTimeout instead or if both are
set, make sure derby.locks.waitTimeout is longer than
derby.locks.deadlockTimeout.
http://db.apache.org/derby/docs/dev/ref/rrefproper10607.html
Kathey
-Dderby.language.sequence.preallocator=1 DERBY4437Sequence 10 100000000
> dellater.txt The lock timeout trace looks as follows(This stack trace
is from trunk.I have seen similar behavior with 10.8.2.1 RC) ERROR
40XL1: A lock could not be obtained within the time requested at
java.lang.Throwable.<init>(Throwable.java:67) at
org.apache.derby.iapi.error.StandardException.<init>(StandardException.java:80)
at
org.apache.derby.iapi.error.StandardException.<init>(StandardException.java:69)
at
org.apache.derby.iapi.error.StandardException.newException(StandardException.java)
at
org.apache.derby.impl.services.locks.ConcurrentLockSet.lockObject(ConcurrentLockSet.java:618)
at
org.apache.derby.impl.services.locks.AbstractPool.lockObject(AbstractPool.java:119)
at
org.apache.derby.impl.services.locks.ConcurrentPool.lockObject(ConcurrentPool.java:28)
at
org.apache.derby.impl.store.raw.xact.RowLocking3.lockRecordForWrite(RowLocking3.java:248)
at
org.apache.derby.impl.store.access.conglomerate.OpenConglomerate.lockPositionForWrite(OpenConglomerate.java:587)
at
org.apache.derby.impl.store.access.conglomerate.GenericConglomerateController.fetch(GenericConglomerateController.java:382)
at
org.apache.derby.impl.sql.catalog.DataDictionaryImpl.updateCurrentSeqValue(DataDictionaryImpl.java:10279)
at
org.apache.derby.impl.sql.catalog.DataDictionaryImpl.updateCurrentIdentityValue(DataDictionaryImpl.java:10139)
at
org.apache.derby.impl.sql.catalog.SequenceUpdater$SyscolumnsUpdater.updateCurrentValueOnDisk(SequenceUpdater.java:596)
at
org.apache.derby.impl.sql.catalog.SequenceUpdater.updateCurrentValueOnDisk(SequenceUpdater.java:477)
at
org.apache.derby.impl.sql.catalog.SequenceUpdater.getCurrentValueAndAdvance(SequenceUpdater.java:353)
at
org.apache.derby.impl.sql.catalog.DataDictionaryImpl.getCurrentValueAndAdvance(DataDictionaryImpl.java:10337)
at
org.apache.derby.impl.sql.execute.InsertResultSet.getSetAutoincrementValue(InsertResultSet.java:827)
at
org.apache.derby.impl.sql.execute.BaseActivation.getSetAutoincrementValue(BaseActivation.java:666)
at
org.apache.derby.exe.ac846c00a0x0132xbb55xece3x00000028ca080.e0(Unknown
Source) at
org.apache.derby.impl.services.reflect.DirectCall.invoke(ReflectGeneratedClass.java:139)
at
org.apache.derby.impl.sql.execute.RowResultSet.getNextRowCore(RowResultSet.java:148)
at
org.apache.derby.impl.sql.execute.NormalizeResultSet.getNextRowCore(NormalizeResultSet.java:185)
at
org.apache.derby.impl.sql.execute.DMLWriteResultSet.getNextRowCore(DMLWriteResultSet.java:127)
at
org.apache.derby.impl.sql.execute.InsertResultSet.open(InsertResultSet.java:518)
at
org.apache.derby.impl.sql.GenericPreparedStatement.executeStmt(GenericPreparedStatement.java:436)
at
org.apache.derby.impl.sql.GenericPreparedStatement.execute(GenericPreparedStatement.java:317)
at
org.apache.derby.impl.jdbc.EmbedStatement.executeStatement(EmbedStatement.java:1242)
at
org.apache.derby.impl.jdbc.EmbedPreparedStatement.executeStatement(EmbedPreparedStatement.java:1686)
at
org.apache.derby.impl.jdbc.EmbedPreparedStatement.execute(EmbedPreparedStatement.java:1341)
at DERBY4437Sequence.run(DERBY4437Sequence.java:61) The test looks as
follows import java.sql.*; public class DERBY4437Sequence extends Thread
{ public static void main(String[] args) throws Exception { int
numberOfThreads = 1000; int numberOfInserts = 100; if (args.length == 1)
{ numberOfThreads = Integer.parseInt(args[0]); } if (args.length == 2) {
numberOfThreads = Integer.parseInt(args[0]); numberOfInserts =
Integer.parseInt(args[1]); } DERBY4437Sequence initThreads[] = new
DERBY4437Sequence[numberOfThreads]; Connection conn = null;
Class.forName("org.apache.derby.jdbc.EmbeddedDriver"); conn =
DriverManager.getConnection( "jdbc:derby:DERBY4437DB;create=true");
conn.setAutoCommit(false); Statement st = conn.createStatement();
st.executeUpdate("create table sequenceTable(c11 int "+ "generated by
default as identity, c12 int)"); conn.commit(); conn.close();
System.out.println("Get threads going"); for (int i = 0; i <
numberOfThreads; i++) { initThreads[i] = new DERBY4437Sequence(i,
numberOfInserts); initThreads[i].start(); sleep(1); }
System.out.println("Done with threads"); } private int threadNumber;
private int numberOfInserts; private PreparedStatement ps; private
Connection conn; DERBY4437Sequence(int threadNumber, int
numberOfInserts) throws Exception { this.threadNumber = threadNumber;
this.numberOfInserts = numberOfInserts; conn =
DriverManager.getConnection( "jdbc:derby:DERBY4437DB");
conn.setAutoCommit(false); ps = conn.prepareStatement("insert into "+
"sequenceTable(c12) values(1)"); System.out.println("Created ps for
thread numer" + threadNumber); } public void run() {
System.out.println(threadNumber + " is now running"); try { for (int i =
0; i < numberOfInserts; i++) { ps.execute(); if (i%1000 == 0) {
System.out.println("commit after every 1000 rows " + i + " by thread " +
threadNumber); conn.commit(); } } } catch (Exception ex) {
System.out.println("error in thread " + threadNumber);
ex.printStackTrace(); } System.out.println(threadNumber + " is done
running"); } }