private void testCreateClusterAtRuntime() throws SQLException { if (config.memory || config.networked || config.cipher != null) { return; } int port1 = 9191, port2 = 9192; String serverList = "localhost:" + port1 + ",localhost:" + port2; deleteFiles(); org.h2.Driver.load(); String user = getUser(), password = getPassword(); Connection conn; Statement stat; String url1 = "jdbc:h2:tcp://localhost:" + port1 + "/test"; String url2 = "jdbc:h2:tcp://localhost:" + port2 + "/test"; String urlCluster = "jdbc:h2:tcp://" + serverList + "/test"; int len = 10; // initialize the database Server n1 = org.h2.tools.Server.createTcpServer( "-tcpPort", "" + port1, "-baseDir", getBaseDir() + "/node1") .start(); conn = DriverManager.getConnection(url1, user, password); stat = conn.createStatement(); stat.execute( "create table test(id int primary key, name varchar) as " + "select x, 'Data' || x from system_range(0, " + (len - 1) + ")"); stat.execute("create user test password 'test'"); stat.execute("grant all on test to test"); // start the second server Server n2 = org.h2.tools.Server.createTcpServer( "-tcpPort", "" + port2, "-baseDir", getBaseDir() + "/node2") .start(); // copy the database and initialize the cluster CreateCluster.main( "-urlSource", url1, "-urlTarget", url2, "-user", user, "-password", password, "-serverList", serverList); // check the original connection is closed try { stat.execute("select * from test"); fail(); } catch (SQLException e) { // expected JdbcUtils.closeSilently(conn); } // test the cluster connection Connection connApp = DriverManager.getConnection(urlCluster + ";AUTO_RECONNECT=TRUE", user, password); check(connApp, len, "'" + serverList + "'"); // delete the rows, but don't commit connApp.setAutoCommit(false); connApp.createStatement().execute("delete from test"); // stop server 2, and test if only one server is available n2.stop(); // rollback the transaction connApp.createStatement().executeQuery("select count(*) from test"); connApp.rollback(); check(connApp, len, "''"); connApp.setAutoCommit(true); // re-create the cluster n2 = org.h2.tools.Server.createTcpServer( "-tcpPort", "" + port2, "-baseDir", getBaseDir() + "/node2") .start(); CreateCluster.main( "-urlSource", url1, "-urlTarget", url2, "-user", user, "-password", password, "-serverList", serverList); // test the cluster connection check(connApp, len, "'" + serverList + "'"); // test a non-admin user String user2 = "test", password2 = getPassword("test"); connApp = DriverManager.getConnection(urlCluster, user2, password2); check(connApp, len, "'" + serverList + "'"); n1.stop(); // test non-admin cluster connection if only one server runs Connection connApp2 = DriverManager.getConnection(urlCluster + ";AUTO_RECONNECT=TRUE", user2, password2); check(connApp2, len, "''"); connApp2.close(); // test non-admin cluster connection if only one server runs connApp2 = DriverManager.getConnection(urlCluster + ";AUTO_RECONNECT=TRUE", user2, password2); check(connApp2, len, "''"); connApp2.close(); n2.stop(); deleteFiles(); }
private void testStartStopCluster() throws SQLException { if (config.memory || config.networked || config.cipher != null) { return; } int port1 = 9193, port2 = 9194; String serverList = "localhost:" + port1 + ",localhost:" + port2; deleteFiles(); // initialize the database Connection conn; org.h2.Driver.load(); String urlNode1 = getURL("node1/test", true); String urlNode2 = getURL("node2/test", true); String user = getUser(), password = getPassword(); conn = DriverManager.getConnection(urlNode1, user, password); Statement stat; stat = conn.createStatement(); stat.execute("DROP TABLE IF EXISTS TEST"); stat.execute("CREATE TABLE TEST(ID INT PRIMARY KEY, NAME VARCHAR(255))"); PreparedStatement prep = conn.prepareStatement("INSERT INTO TEST VALUES(?, ?)"); int len = getSize(10, 1000); for (int i = 0; i < len; i++) { prep.setInt(1, i); prep.setString(2, "Data" + i); prep.executeUpdate(); } check(conn, len, "''"); conn.close(); // copy the database and initialize the cluster CreateCluster.main( "-urlSource", urlNode1, "-urlTarget", urlNode2, "-user", user, "-password", password, "-serverList", serverList); // start both servers Server n1 = org.h2.tools.Server.createTcpServer( "-tcpPort", "" + port1, "-baseDir", getBaseDir() + "/node1") .start(); Server n2 = org.h2.tools.Server.createTcpServer( "-tcpPort", "" + port2, "-baseDir", getBaseDir() + "/node2") .start(); // try to connect in standalone mode - should fail try { conn = DriverManager.getConnection("jdbc:h2:tcp://localhost:" + port1 + "/test", user, password); fail("should not be able to connect in standalone mode"); } catch (SQLException e) { assertKnownException(e); } try { DriverManager.getConnection("jdbc:h2:tcp://localhost:" + port2 + "/test", user, password); fail("should not be able to connect in standalone mode"); } catch (SQLException e) { assertKnownException(e); } // test a cluster connection conn = DriverManager.getConnection("jdbc:h2:tcp://" + serverList + "/test", user, password); check(conn, len, "'" + serverList + "'"); conn.close(); // stop server 2, and test if only one server is available n2.stop(); conn = DriverManager.getConnection("jdbc:h2:tcp://" + serverList + "/test", user, password); check(conn, len, "''"); conn.close(); conn = DriverManager.getConnection("jdbc:h2:tcp://" + serverList + "/test", user, password); check(conn, len, "''"); conn.close(); // disable the cluster conn = DriverManager.getConnection( "jdbc:h2:tcp://localhost:" + port1 + "/test;CLUSTER=''", user, password); conn.close(); n1.stop(); // re-create the cluster DeleteDbFiles.main("-dir", getBaseDir() + "/node2", "-quiet"); CreateCluster.main( "-urlSource", urlNode1, "-urlTarget", urlNode2, "-user", user, "-password", password, "-serverList", serverList); n1 = org.h2.tools.Server.createTcpServer( "-tcpPort", "" + port1, "-baseDir", getBaseDir() + "/node1") .start(); n2 = org.h2.tools.Server.createTcpServer( "-tcpPort", "" + port2, "-baseDir", getBaseDir() + "/node2") .start(); conn = DriverManager.getConnection("jdbc:h2:tcp://" + serverList + "/test", user, password); stat = conn.createStatement(); stat.execute("CREATE TABLE BOTH(ID INT)"); n1.stop(); stat.execute("CREATE TABLE A(ID INT)"); conn.close(); n2.stop(); n1 = org.h2.tools.Server.createTcpServer( "-tcpPort", "" + port1, "-baseDir", getBaseDir() + "/node1") .start(); conn = DriverManager.getConnection( "jdbc:h2:tcp://localhost:" + port1 + "/test;CLUSTER=''", user, password); check(conn, len, "''"); conn.close(); n1.stop(); n2 = org.h2.tools.Server.createTcpServer( "-tcpPort", "" + port2, "-baseDir", getBaseDir() + "/node2") .start(); conn = DriverManager.getConnection( "jdbc:h2:tcp://localhost:" + port2 + "/test;CLUSTER=''", user, password); check(conn, len, "''"); conn.createStatement().execute("SELECT * FROM A"); conn.close(); n2.stop(); deleteFiles(); }