package my.test.cluster;
import static junit.framework.Assert.assertEquals;
import java.sql.SQLException;
import java.sql.Savepoint;
import my.test.TestBase;
import org.junit.Assert;
public class ClusterTest extends TestBase {
public static void main(String[] args) throws Exception {
new ClusterTest().start();
}
@Override
public void init() throws Exception {
url = "jdbc:h2:tcp://localhost:9092,localhost:9093/mydb";
}
@Override
public void startInternal() throws Exception {
//create();
insert();
// select();
//
testCommit();
//testRollback();
//testSavepoint();
}
void create() throws Exception {
stmt.executeUpdate("DROP TABLE IF EXISTS ClusterTest");
stmt.executeUpdate("CREATE TABLE IF NOT EXISTS ClusterTest (f1 int NOT NULL, f2 int, f3 varchar)");
stmt.executeUpdate("CREATE PRIMARY KEY HASH IF NOT EXISTS ClusterTest_idx1 ON ClusterTest(f1)");
stmt.executeUpdate("CREATE UNIQUE HASH INDEX IF NOT EXISTS ClusterTest_idx2 ON ClusterTest(f2)");
stmt.executeUpdate("CREATE INDEX IF NOT EXISTS ClusterTest_idx3 ON ClusterTest(f3, f2)");
}
void delete() throws Exception {
stmt.executeUpdate("DELETE FROM ClusterTest");
}
void insert() throws Exception {
stmt.executeUpdate("DELETE FROM ClusterTest");
stmt.executeUpdate("INSERT INTO ClusterTest(f3, f2, f1) VALUES('d', 40, 400)");
stmt.executeUpdate("INSERT INTO ClusterTest(f1, f2, f3) VALUES(100, 10, 'a')");
stmt.executeUpdate("INSERT INTO ClusterTest(f1, f2, f3) VALUES(200, 20, 'b')");
stmt.executeUpdate("INSERT INTO ClusterTest(f1, f2, f3) VALUES(300, 30, 'c')");
try {
stmt.executeUpdate("INSERT INTO ClusterTest(f1, f2, f3) VALUES(400, 20, 'd')");
Assert.fail("insert duplicate key: 20");
} catch (SQLException e) {
//e.printStackTrace();
}
try {
stmt.executeUpdate("INSERT INTO ClusterTest(f1, f2, f3) VALUES(500, 20, 'e')");
Assert.fail("insert duplicate key: 20");
} catch (SQLException e) {
//e.printStackTrace();
}
try {
stmt.executeUpdate("INSERT INTO ClusterTest(f1, f2, f3) VALUES(600, 20, 'f')");
Assert.fail("insert duplicate key: 20");
} catch (SQLException e) {
//e.printStackTrace();
}
}
void testCommit() throws Exception {
try {
conn.setAutoCommit(false);
insert();
conn.commit();
} finally {
conn.setAutoCommit(true);
}
sql = "SELECT f1, f2, f3 FROM ClusterTest";
printResultSet();
sql = "SELECT count(*) FROM ClusterTest";
assertEquals(4, getIntValue(1, true));
sql = "DELETE FROM ClusterTest";
assertEquals(4, stmt.executeUpdate(sql));
sql = "SELECT count(*) FROM ClusterTest";
assertEquals(0, getIntValue(1, true));
}
void testRollback() throws Exception {
try {
conn.setAutoCommit(false);
insert();
conn.rollback();
} finally {
conn.setAutoCommit(true);
}
sql = "SELECT count(*) FROM ClusterTest";
assertEquals(0, getIntValue(1, true));
}
void select() throws Exception {
sql = "SELECT f1, f2, f3 FROM ClusterTest";
printResultSet();
sql = "SELECT count(*) FROM ClusterTest";
assertEquals(3, getIntValue(1, true));
sql = "SELECT f1, f2, f3 FROM ClusterTest WHERE f1 >= 200";
printResultSet();
sql = "SELECT count(*) FROM ClusterTest WHERE f1 >= 200";
assertEquals(2, getIntValue(1, true));
sql = "SELECT f1, f2, f3 FROM ClusterTest WHERE f2 >= 20";
printResultSet();
sql = "SELECT count(*) FROM ClusterTest WHERE f2 >= 20";
assertEquals(2, getIntValue(1, true));
sql = "SELECT f1, f2, f3 FROM ClusterTest WHERE f3 >= 'b' AND f3 <= 'c'";
printResultSet();
sql = "SELECT count(*) FROM ClusterTest WHERE f3 >= 'b' AND f3 <= 'c'";
assertEquals(2, getIntValue(1, true));
sql = "DELETE FROM ClusterTest WHERE f2 >= 20";
assertEquals(2, stmt.executeUpdate(sql));
}
void testSavepoint() throws Exception {
stmt.executeUpdate("DELETE FROM ClusterTest");
try {
conn.setAutoCommit(false);
stmt.executeUpdate("INSERT INTO ClusterTest(f1, f2, f3) VALUES(100, 10, 'a')");
stmt.executeUpdate("INSERT INTO ClusterTest(f1, f2, f3) VALUES(200, 20, 'b')");
Savepoint savepoint = conn.setSavepoint();
stmt.executeUpdate("INSERT INTO ClusterTest(f1, f2, f3) VALUES(300, 30, 'c')");
sql = "SELECT f1, f2, f3 FROM ClusterTest";
printResultSet();
conn.rollback(savepoint);
//调用rollback(savepoint)后还是需要调用commit
conn.commit();
//或调用rollback也能撤消之前的操作
//conn.rollback();
} finally {
//这个内部也会触发commit
conn.setAutoCommit(true);
}
sql = "SELECT f1, f2, f3 FROM ClusterTest";
printResultSet();
}
}