/*
* Copyright 2004-2014 H2 Group. Multiple-Licensed under the MPL 2.0,
* and the EPL 1.0 (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package org.h2.test.synth;
import org.h2.test.TestBase;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.concurrent.CountDownLatch;
/**
* Tests lock releasing for concurrent select statements
*/
public class TestReleaseSelectLock extends TestBase {
private static final String TEST_DB_NAME = "releaseSelectLock";
/**
* Run just this test.
*
* @param a ignored
*/
public static void main(String... a) throws Exception {
TestBase.createCaller().init().test();
}
@Override
public void test() throws Exception {
config.mvStore = false;
config.mvcc = false;
config.multiThreaded = true;
deleteDb(TEST_DB_NAME);
Connection conn = getConnection(TEST_DB_NAME);
final Statement statement = conn.createStatement();
statement.execute("create table test(id int primary key)");
runConcurrentSelects();
// check that all locks have been released by dropping the test table
statement.execute("drop table test");
statement.close();
conn.close();
deleteDb(TEST_DB_NAME);
}
private void runConcurrentSelects() throws InterruptedException {
int tryCount = 500;
int threadsCount = getSize(2, 4);
for (int tryNumber = 0; tryNumber < tryCount; tryNumber++) {
final CountDownLatch allFinished = new CountDownLatch(threadsCount);
for (int i = 0; i < threadsCount; i++) {
new Thread(new Runnable() {
@Override
public void run() {
try {
Connection conn = getConnection(TEST_DB_NAME);
PreparedStatement stmt = conn.prepareStatement("select id from test");
ResultSet rs = stmt.executeQuery();
while (rs.next()) {
rs.getInt(1);
}
stmt.close();
conn.close();
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
allFinished.countDown();
}
}
}).start();
}
allFinished.await();
}
}
}