提交 9a0081ba authored 作者: Thomas Mueller's avatar Thomas Mueller

The auto-reconnect feature didn't work when using the auto-server mode. Fixed.

上级 1173ab9b
...@@ -224,10 +224,10 @@ public class SessionRemote implements SessionInterface, DataHandler { ...@@ -224,10 +224,10 @@ public class SessionRemote implements SessionInterface, DataHandler {
} }
public SessionInterface createSession(ConnectionInfo ci) throws SQLException { public SessionInterface createSession(ConnectionInfo ci) throws SQLException {
return new SessionRemote(ci).connectEmbeddedOrServer(); return new SessionRemote(ci).connectEmbeddedOrServer(false);
} }
private SessionInterface connectEmbeddedOrServer() throws SQLException { private SessionInterface connectEmbeddedOrServer(boolean openNew) throws SQLException {
ConnectionInfo ci = connectionInfo; ConnectionInfo ci = connectionInfo;
if (ci.isRemote()) { if (ci.isRemote()) {
connectServer(ci); connectServer(ci);
...@@ -243,6 +243,9 @@ public class SessionRemote implements SessionInterface, DataHandler { ...@@ -243,6 +243,9 @@ public class SessionRemote implements SessionInterface, DataHandler {
connectionInfo = (ConnectionInfo) ci.clone(); connectionInfo = (ConnectionInfo) ci.clone();
} }
SessionInterface si = (SessionInterface) ClassUtils.loadSystemClass("org.h2.engine.Session").newInstance(); SessionInterface si = (SessionInterface) ClassUtils.loadSystemClass("org.h2.engine.Session").newInstance();
if (openNew) {
ci.setProperty("OPEN_NEW", "true");
}
return si.createSession(ci); return si.createSession(ci);
} catch (SQLException e) { } catch (SQLException e) {
int errorCode = e.getErrorCode(); int errorCode = e.getErrorCode();
...@@ -434,7 +437,7 @@ public class SessionRemote implements SessionInterface, DataHandler { ...@@ -434,7 +437,7 @@ public class SessionRemote implements SessionInterface, DataHandler {
return false; return false;
} }
lastReconnect++; lastReconnect++;
embedded = connectEmbeddedOrServer(); embedded = connectEmbeddedOrServer(false);
if (embedded == this) { if (embedded == this) {
// connected to a server somewhere else // connected to a server somewhere else
embedded = null; embedded = null;
...@@ -442,7 +445,7 @@ public class SessionRemote implements SessionInterface, DataHandler { ...@@ -442,7 +445,7 @@ public class SessionRemote implements SessionInterface, DataHandler {
// opened an embedded connection now - // opened an embedded connection now -
// must connect to this database in server mode // must connect to this database in server mode
// unfortunately // unfortunately
connectEmbeddedOrServer(); connectEmbeddedOrServer(true);
} }
if (sessionState != null && sessionState.size() > 0) { if (sessionState != null && sessionState.size() > 0) {
sessionStateUpdating = true; sessionStateUpdating = true;
......
...@@ -54,11 +54,27 @@ public class TestAutoReconnect extends TestBase implements DatabaseEventListener ...@@ -54,11 +54,27 @@ public class TestAutoReconnect extends TestBase implements DatabaseEventListener
} }
public void test() throws Exception { public void test() throws Exception {
test(true); testIsClosed();
test(false); testReconnect(true);
testReconnect(false);
} }
private void test(boolean autoServer) throws Exception { private void testIsClosed() throws Exception {
deleteDb("autoReconnect");
url = "jdbc:h2:" + baseDir + "/autoReconnect;" +
"AUTO_SERVER=TRUE;OPEN_NEW=TRUE";
Connection conn1 = DriverManager.getConnection(url);
conn1.createStatement().execute("CREATE TABLE TEST(ID INT)");
Connection conn2 = DriverManager.getConnection(url);
assertFalse(conn1.isClosed());
conn1.close();
assertTrue(conn1.isClosed());
assertFalse(conn2.isClosed());
conn2.close();
assertTrue(conn1.isClosed());
}
private void testReconnect(boolean autoServer) throws Exception {
this.autoServer = autoServer; this.autoServer = autoServer;
deleteDb("autoReconnect"); deleteDb("autoReconnect");
if (autoServer) { if (autoServer) {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论