提交 131af90f authored 作者: Thomas Mueller's avatar Thomas Mueller

Sequences don't work

上级 5eb00892
...@@ -110,6 +110,18 @@ public abstract class Task implements Runnable { ...@@ -110,6 +110,18 @@ public abstract class Task implements Runnable {
* @return the exception or null * @return the exception or null
*/ */
public Exception getException() { public Exception getException() {
join();
if (ex != null) {
return ex;
}
return null;
}
/**
* Stop the thread and wait until it is no longer running. Exceptions are
* ignored.
*/
public void join() {
stop = true; stop = true;
if (thread == null) { if (thread == null) {
throw new IllegalStateException("Thread not started"); throw new IllegalStateException("Thread not started");
...@@ -119,10 +131,6 @@ public abstract class Task implements Runnable { ...@@ -119,10 +131,6 @@ public abstract class Task implements Runnable {
} catch (InterruptedException e) { } catch (InterruptedException e) {
// ignore // ignore
} }
if (ex != null) {
return ex;
}
return null;
} }
} }
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
package org.h2.test.db; package org.h2.test.db;
import java.sql.Connection; import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.sql.Statement; import java.sql.Statement;
...@@ -13,6 +14,7 @@ import java.util.ArrayList; ...@@ -13,6 +14,7 @@ import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import org.h2.test.TestBase; import org.h2.test.TestBase;
import org.h2.util.Task;
/** /**
* Tests the sequence feature of this database. * Tests the sequence feature of this database.
...@@ -29,7 +31,9 @@ public class TestSequence extends TestBase { ...@@ -29,7 +31,9 @@ public class TestSequence extends TestBase {
} }
@Override @Override
public void test() throws SQLException { public void test() throws Exception {
testConcurrentCreate();
;if(true)return;
testSchemaSearchPath(); testSchemaSearchPath();
testAlterSequenceColumn(); testAlterSequenceColumn();
testAlterSequence(); testAlterSequence();
...@@ -44,6 +48,59 @@ public class TestSequence extends TestBase { ...@@ -44,6 +48,59 @@ public class TestSequence extends TestBase {
deleteDb("sequence"); deleteDb("sequence");
} }
private void testConcurrentCreate() throws Exception {
while(true)
try {
testConcurrentCreate2();
} catch(Exception e) {
System.out.println(e);
}
}
private void testConcurrentCreate2() throws Exception {
deleteDb("sequence");
final String url = getURL("sequence;MULTI_THREADED=1", true);
Connection conn = getConnection(url);
Task[] tasks = new Task[2];
try {
Statement stat = conn.createStatement();
stat.execute("create table test(id bigint primary key)");
stat.execute("create sequence test_seq cache 2");
for (int i = 0; i < tasks.length; i++) {
tasks[i] = new Task() {
@Override
public void call() throws Exception {
Connection conn = getConnection(url);
try {
PreparedStatement prep = conn.prepareStatement(
"insert into test(id) values(next value for test_seq)");
PreparedStatement prep2 = conn.prepareStatement(
"delete from test");
while (!stop) {
prep.execute();
if (Math.random() < 0.01) {
prep2.execute();
}
}
} finally {
conn.close();
}
}
}.execute();
}
Thread.sleep(100);
for (Task t : tasks) {
t.get();
}
stat.execute("shutdown immediately");
} finally {
for (Task t : tasks) {
t.join();
}
conn.close();
}
}
private void testSchemaSearchPath() throws SQLException { private void testSchemaSearchPath() throws SQLException {
deleteDb("sequence"); deleteDb("sequence");
Connection conn = getConnection("sequence"); Connection conn = getConnection("sequence");
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论