提交 07bf06a2 authored 作者: Andrei Tokar's avatar Andrei Tokar

ensure proper connections closure in tests to avoid background threads leak

上级 60aa28a7
......@@ -25,31 +25,35 @@ public class TestAnalyzeTableTx extends TestDb {
@Override
public boolean isEnabled() {
if (config.networked || config.big) {
return false;
}
return true;
return !config.networked && !config.big;
}
@Override
public void test() throws Exception {
deleteDb(getTestName());
Connection shared = getConnection(getTestName());
Statement statement = shared.createStatement();
statement.executeUpdate("DROP TABLE IF EXISTS TEST");
statement.executeUpdate("CREATE TABLE TEST(ID INT PRIMARY KEY)");
Connection[] connections = new Connection[C];
for (int i = 0; i < C; i++) {
Connection c = getConnection(getTestName());
c.createStatement().executeUpdate("INSERT INTO TEST VALUES (" + i + ')');
connections[i] = c;
}
try (ResultSet rs = statement.executeQuery("SELECT * FROM TEST")) {
try (Connection shared = getConnection(getTestName())) {
Statement statement = shared.createStatement();
statement.executeUpdate("DROP TABLE IF EXISTS TEST");
statement.executeUpdate("CREATE TABLE TEST(ID INT PRIMARY KEY)");
for (int i = 0; i < C; i++) {
if (!rs.next())
throw new Exception("next");
if (rs.getInt(1) != i)
throw new Exception(Integer.toString(i));
Connection c = getConnection(getTestName());
c.createStatement().executeUpdate("INSERT INTO TEST VALUES (" + i + ')');
connections[i] = c;
}
try (ResultSet rs = statement.executeQuery("SELECT * FROM TEST")) {
for (int i = 0; i < C; i++) {
if (!rs.next())
throw new Exception("next");
if (rs.getInt(1) != i)
throw new Exception(Integer.toString(i));
}
}
} finally {
for (Connection connection : connections) {
if (connection != null) {
try { connection.close(); } catch (Throwable ignore) {/**/}
}
}
}
}
......
......@@ -506,8 +506,7 @@ public class TestMultiThread extends TestDb implements Runnable {
@Override
public void run() {
try {
Connection c = getConnection("concurrentUpdate2;LOCK_TIMEOUT=10000");
try (Connection c = getConnection("concurrentUpdate2;LOCK_TIMEOUT=10000")) {
PreparedStatement ps = c.prepareStatement("UPDATE TEST SET V = ? WHERE " + column + " = ?");
for (int test = 0; test < 1000; test++) {
for (int i = 0; i < 16; i++) {
......@@ -524,34 +523,36 @@ public class TestMultiThread extends TestDb implements Runnable {
private void testConcurrentUpdate2() throws Exception {
deleteDb("concurrentUpdate2");
Connection c = getConnection("concurrentUpdate2");
Statement s = c.createStatement();
s.execute("CREATE TABLE TEST(A INT, B INT, V INT, PRIMARY KEY(A, B))");
PreparedStatement ps = c.prepareStatement("INSERT INTO TEST VALUES (?, ?, ?)");
for (int i = 0; i < 16; i++) {
for (int j = 0; j < 16; j++) {
ps.setInt(1, i);
ps.setInt(2, j);
ps.setInt(3, 0);
ps.executeUpdate();
try (Connection c = getConnection("concurrentUpdate2")) {
Statement s = c.createStatement();
s.execute("CREATE TABLE TEST(A INT, B INT, V INT, PRIMARY KEY(A, B))");
PreparedStatement ps = c.prepareStatement("INSERT INTO TEST VALUES (?, ?, ?)");
for (int i = 0; i < 16; i++) {
for (int j = 0; j < 16; j++) {
ps.setInt(1, i);
ps.setInt(2, j);
ps.setInt(3, 0);
ps.executeUpdate();
}
}
}
ConcurrentUpdate2 a = new ConcurrentUpdate2("A");
ConcurrentUpdate2 b = new ConcurrentUpdate2("B");
a.start();
b.start();
a.join();
b.join();
deleteDb("concurrentUpdate2");
Throwable e = a.exception;
if (e == null) {
e = b.exception;
}
if (e != null) {
if (e instanceof Exception) {
throw (Exception) e;
ConcurrentUpdate2 a = new ConcurrentUpdate2("A");
ConcurrentUpdate2 b = new ConcurrentUpdate2("B");
a.start();
b.start();
a.join();
b.join();
Throwable e = a.exception;
if (e == null) {
e = b.exception;
}
throw (Error) e;
if (e != null) {
if (e instanceof Exception) {
throw (Exception) e;
}
throw (Error) e;
}
} finally {
deleteDb("concurrentUpdate2");
}
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论