提交 458dd3d8 authored 作者: Noel Grandin's avatar Noel Grandin

cleanup new testcase

上级 ddf7b783
...@@ -10,19 +10,18 @@ import java.sql.PreparedStatement; ...@@ -10,19 +10,18 @@ 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;
import java.util.Map; import java.util.ArrayList;
import java.util.concurrent.atomic.AtomicBoolean;
import org.h2.test.TestBase;
import org.h2.jdbc.JdbcSQLException;
import org.h2.api.ErrorCode; import org.h2.api.ErrorCode;
import org.h2.jdbc.JdbcSQLException;
import org.h2.test.TestBase;
import org.h2.util.IOUtils;
/** /**
* Additional MVCC (multi version concurrency) test cases. * Additional MVCC (multi version concurrency) test cases.
*/ */
public class TestMvccMultiThreaded2 extends TestBase { public class TestMvccMultiThreaded2 extends TestBase {
private static final AtomicBoolean running = new AtomicBoolean(true); private static final String URL = ";MVCC=TRUE;LOCK_TIMEOUT=120000;MULTI_THREADED=TRUE";
private static final String url = ";MVCC=TRUE;LOCK_TIMEOUT=120000;MULTI_THREADED=TRUE";
/** /**
* Run just this test. * Run just this test.
...@@ -39,98 +38,81 @@ public class TestMvccMultiThreaded2 extends TestBase { ...@@ -39,98 +38,81 @@ public class TestMvccMultiThreaded2 extends TestBase {
} }
@Override @Override
public void test() throws SQLException { public void test() throws SQLException, InterruptedException {
if (config.cipher != null || !config.lazy) {
return;
}
testSelectForUpdateConcurrency(); testSelectForUpdateConcurrency();
} }
private void testSelectForUpdateConcurrency() throws SQLException { private void testSelectForUpdateConcurrency()
throws SQLException, InterruptedException {
deleteDb(getTestName()); deleteDb(getTestName());
Connection conn = getConnection(getTestName() + url); Connection conn = getConnection(getTestName() + URL);
conn.setAutoCommit(false); conn.setAutoCommit(false);
String sql = "CREATE TABLE testmvccmultithreaded2 (" String sql = "CREATE TABLE test ("
+ "entity_id INTEGER NOT NULL PRIMARY KEY, " + "entity_id INTEGER NOT NULL PRIMARY KEY, "
+ "lastUpdated INTEGER NOT NULL)"; + "lastUpdated INTEGER NOT NULL)";
Statement smtm = conn.createStatement(); Statement smtm = conn.createStatement();
smtm.executeUpdate(sql); smtm.executeUpdate(sql);
PreparedStatement ps = conn.prepareStatement( PreparedStatement ps = conn.prepareStatement(
"INSERT INTO testmvccmultithreaded2 (entity_id, lastUpdated) VALUES (?, ?)"); "INSERT INTO test (entity_id, lastUpdated) VALUES (?, ?)");
ps.setInt(1, 1); ps.setInt(1, 1);
ps.setInt(2, 100); ps.setInt(2, 100);
ps.executeUpdate(); ps.executeUpdate();
conn.commit(); conn.commit();
int howManyThreads = 100; ArrayList<SelectForUpdate> threads = new ArrayList<SelectForUpdate>();
Thread[] threads = new SelectForUpdate[howManyThreads]; for (int i = 0; i < 100; i++) {
for (int i = 0; i < howManyThreads; i++) { SelectForUpdate sfu = new SelectForUpdate();
threads[i] = new SelectForUpdate(); threads.add(sfu);
threads[i].start(); sfu.start();
} }
try { for (SelectForUpdate sfu : threads) {
for (int i = 0; i < howManyThreads; i++) { sfu.join();
threads[i].join();
}
} catch (InterruptedException e) {
e.printStackTrace();
} }
smtm = conn.createStatement(); IOUtils.closeSilently(conn);
smtm.execute("DROP TABLE testmvccmultithreaded2"); deleteDb(getTestName());
if (conn != null) {
try {
conn.close();
} catch (SQLException e1) {
e1.printStackTrace();
}
}
} }
private class SelectForUpdate extends Thread { private class SelectForUpdate extends Thread {
@Override @Override
public void run() { public void run() {
long start = System.currentTimeMillis(); final long start = System.currentTimeMillis();
boolean done = false; boolean done = false;
Connection conn = null; Connection conn = null;
while(running.get() && !done) { try {
try { conn = getConnection(getTestName() + URL);
conn = getConnection(getTestName() + url); conn.setAutoCommit(false);
conn.setAutoCommit(false); while (!done) {
try {
PreparedStatement ps = conn.prepareStatement( PreparedStatement ps = conn.prepareStatement(
"SELECT * FROM testmvccmultithreaded2 WHERE entity_id = ? FOR UPDATE"); "SELECT * FROM test WHERE entity_id = ? FOR UPDATE");
ps.setString(1, "1"); ps.setString(1, "1");
ResultSet rs = ps.executeQuery(); ResultSet rs = ps.executeQuery();
assertTrue(rs.next()); assertTrue(rs.next());
assertTrue(rs.getInt(2) == 100); assertTrue(rs.getInt(2) == 100);
conn.commit(); conn.commit();
long now = System.currentTimeMillis(); long now = System.currentTimeMillis();
if (now - start > 1000*60) done = true; if (now - start > 1000 * 60)
} catch (JdbcSQLException e1) { done = true;
// skip DUPLICATE_KEY_1 to just focus on } catch (JdbcSQLException e1) {
// this bug. // skip DUPLICATE_KEY_1 to just focus on this bug.
if (e1.getErrorCode() != ErrorCode.DUPLICATE_KEY_1) if (e1.getErrorCode() != ErrorCode.DUPLICATE_KEY_1) {
e1.printStackTrace(); throw e1;
} catch (SQLException e2) { }
e2.printStackTrace(); }
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e1) {
e1.printStackTrace();
} }
} catch (SQLException e) {
TestBase.logError("error", e);
} }
IOUtils.closeSilently(conn);
} }
} }
} }
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论