提交 14f69a1c authored 作者: Andrei Tokar's avatar Andrei Tokar

tighten test conditions - do not ignore any exceptions

上级 8b4bfee5
......@@ -8,10 +8,8 @@ package org.h2.test.synth;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Random;
import org.h2.api.ErrorCode;
import org.h2.test.TestBase;
import org.h2.util.Task;
......@@ -29,107 +27,91 @@ public class TestConcurrentUpdate extends TestBase {
* @param a ignored
*/
public static void main(String... a) throws Exception {
TestBase t = TestBase.createCaller().init();
t.config.memory = true;
t.test();
org.h2.test.TestAll config = new org.h2.test.TestAll();
config.memory = true;
config.multiThreaded = true;
// config.mvStore = false;
// config.mvcc = false;
System.out.println(config);
TestBase test = createCaller().init(config);
for (int i = 0; i < 10; i++) {
System.out.println("Pass #" + i);
test.config.beforeTest();
test.test();
test.config.afterTest();
}
}
@Override
public void test() throws Exception {
if (!config.multiThreaded) {
return;
}
deleteDb("concurrent");
final String url = getURL("concurrent", true);
Connection conn = getConnection(url);
Statement stat = conn.createStatement();
stat.execute("create table test(id int primary key, name varchar)");
try (Connection conn = getConnection(url)) {
Statement stat = conn.createStatement();
stat.execute("create table test(id int primary key, name varchar)");
Task[] tasks = new Task[THREADS];
for (int i = 0; i < THREADS; i++) {
final int threadId = i;
Task t = new Task() {
@Override
public void call() throws Exception {
Random r = new Random(threadId);
Connection conn = getConnection(url);
PreparedStatement insert = conn.prepareStatement(
"insert into test values(?, ?)");
PreparedStatement update = conn.prepareStatement(
"update test set name = ? where id = ?");
PreparedStatement delete = conn.prepareStatement(
"delete from test where id = ?");
PreparedStatement select = conn.prepareStatement(
"select * from test where id = ?");
while (!stop) {
try {
int x = r.nextInt(ROW_COUNT);
String data = "x" + r.nextInt(ROW_COUNT);
switch (r.nextInt(3)) {
case 0:
insert.setInt(1, x);
insert.setString(2, data);
insert.execute();
break;
case 1:
update.setString(1, data);
update.setInt(2, x);
update.execute();
break;
case 2:
delete.setInt(1, x);
delete.execute();
break;
case 4:
select.setInt(1, x);
ResultSet rs = select.executeQuery();
while (rs.next()) {
rs.getString(2);
Task[] tasks = new Task[THREADS];
for (int i = 0; i < THREADS; i++) {
final int threadId = i;
Task t = new Task() {
@Override
public void call() throws Exception {
Random r = new Random(threadId);
try (Connection conn = getConnection(url)) {
PreparedStatement insert = conn.prepareStatement(
"merge into test values(?, ?)");
PreparedStatement update = conn.prepareStatement(
"update test set name = ? where id = ?");
PreparedStatement delete = conn.prepareStatement(
"delete from test where id = ?");
PreparedStatement select = conn.prepareStatement(
"select * from test where id = ?");
while (!stop) {
int x = r.nextInt(ROW_COUNT);
String data = "x" + r.nextInt(ROW_COUNT);
switch (r.nextInt(3)) {
case 0:
insert.setInt(1, x);
insert.setString(2, data);
insert.execute();
break;
case 1:
update.setString(1, data);
update.setInt(2, x);
update.execute();
break;
case 2:
delete.setInt(1, x);
delete.execute();
break;
case 4:
select.setInt(1, x);
ResultSet rs = select.executeQuery();
while (rs.next()) {
rs.getString(2);
}
break;
}
break;
}
} catch (SQLException e) {
handleException(e);
}
}
conn.close();
};
tasks[i] = t;
t.execute();
}
// test 2 seconds
for (int i = 0; i < 200; i++) {
Thread.sleep(10);
for (Task t : tasks) {
if (t.isFinished()) {
i = 1000;
break;
}
}
};
tasks[i] = t;
t.execute();
}
// test 2 seconds
for (int i = 0; i < 200; i++) {
Thread.sleep(10);
}
for (Task t : tasks) {
if (t.isFinished()) {
i = 1000;
break;
}
t.get();
}
}
for (Task t : tasks) {
t.get();
}
conn.close();
}
/**
* Handle or ignore the exception.
*
* @param e the exception
*/
void handleException(SQLException e) throws SQLException {
switch (e.getErrorCode()) {
case ErrorCode.CONCURRENT_UPDATE_1:
case ErrorCode.DUPLICATE_KEY_1:
case ErrorCode.ROW_NOT_FOUND_WHEN_DELETING_1:
case ErrorCode.LOCK_TIMEOUT_1:
break;
default:
throw e;
}
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论