提交 23e0c62d authored 作者: Thomas Mueller's avatar Thomas Mueller

New system property h2.maxReconnect.

上级 052a305c
......@@ -57,7 +57,7 @@ public class CommandRemote implements CommandInterface {
id = s.getNextId();
paramCount = 0;
boolean readParams = s.getClientVersion() >= Constants.TCP_PROTOCOL_VERSION_6;
for (int i = 0; i < transferList.size(); i++) {
for (int i = 0, count = 0; i < transferList.size(); i++) {
try {
Transfer transfer = (Transfer) transferList.get(i);
if (readParams && createParams) {
......@@ -84,7 +84,7 @@ public class CommandRemote implements CommandInterface {
}
}
} catch (IOException e) {
s.removeServer(e, i--);
s.removeServer(e, i--, ++count);
}
}
}
......@@ -116,7 +116,7 @@ public class CommandRemote implements CommandInterface {
}
int objectId = session.getNextId();
ResultRemote result = null;
for (int i = 0; i < transferList.size(); i++) {
for (int i = 0, count = 0; i < transferList.size(); i++) {
prepareIfRequired();
Transfer transfer = (Transfer) transferList.get(i);
try {
......@@ -128,7 +128,7 @@ public class CommandRemote implements CommandInterface {
result = new ResultRemote(session, transfer, objectId, columnCount, Integer.MAX_VALUE);
break;
} catch (IOException e) {
session.removeServer(e, i--);
session.removeServer(e, i--, ++count);
}
}
session.autoCommitIfCluster();
......@@ -141,7 +141,7 @@ public class CommandRemote implements CommandInterface {
synchronized (session) {
int objectId = session.getNextId();
ResultRemote result = null;
for (int i = 0; i < transferList.size(); i++) {
for (int i = 0, count = 0; i < transferList.size(); i++) {
prepareIfRequired();
Transfer transfer = (Transfer) transferList.get(i);
try {
......@@ -169,7 +169,7 @@ public class CommandRemote implements CommandInterface {
break;
}
} catch (IOException e) {
session.removeServer(e, i--);
session.removeServer(e, i--, ++count);
}
}
session.autoCommitIfCluster();
......@@ -182,7 +182,7 @@ public class CommandRemote implements CommandInterface {
synchronized (session) {
int updateCount = 0;
boolean autoCommit = false;
for (int i = 0; i < transferList.size(); i++) {
for (int i = 0, count = 0; i < transferList.size(); i++) {
prepareIfRequired();
Transfer transfer = (Transfer) transferList.get(i);
try {
......@@ -193,7 +193,7 @@ public class CommandRemote implements CommandInterface {
updateCount = transfer.readInt();
autoCommit = transfer.readBoolean();
} catch (IOException e) {
session.removeServer(e, i--);
session.removeServer(e, i--, ++count);
}
}
session.setAutoCommit(autoCommit);
......
......@@ -278,6 +278,12 @@ public class SysProperties {
*/
public static final int MAX_QUERY_TIMEOUT = getIntSetting(H2_MAX_QUERY_TIMEOUT, 0);
/**
* System property <code>h2.maxReconnect</code> (default: 3).<br />
* The maximum number of tries to reconnect in a row.
*/
public static final int MAX_RECONNECT = getIntSetting("h2.maxReconnect", 3);
/**
* System property <code>h2.maxTraceDataLength</code> (default: 65535).<br />
* The maximum size of a LOB value that is written as data to the trace system.
......
......@@ -181,14 +181,14 @@ public class SessionRemote implements SessionInterface, DataHandler {
// server side auto commit is off because of race conditions
// (update set id=1 where id=0, but update set id=2 where id=0 is
// faster)
for (int i = 0; i < transferList.size(); i++) {
for (int i = 0, count = 0; i < transferList.size(); i++) {
Transfer transfer = (Transfer) transferList.get(i);
try {
traceOperation("COMMAND_COMMIT", 0);
transfer.writeInt(SessionRemote.COMMAND_COMMIT);
done(transfer);
} catch (IOException e) {
removeServer(e, i--);
removeServer(e, i--, ++count);
}
}
}
......@@ -382,9 +382,9 @@ public class SessionRemote implements SessionInterface, DataHandler {
* @param e the exception (used for debugging)
* @param i the index of the server to remove
*/
public void removeServer(IOException e, int i) throws SQLException {
public void removeServer(IOException e, int i, int count) throws SQLException {
transferList.remove(i);
if (autoReconnect()) {
if (autoReconnect(count)) {
return;
}
checkClosed();
......@@ -403,13 +403,16 @@ public class SessionRemote implements SessionInterface, DataHandler {
*
* @return true if reconnected
*/
public boolean autoReconnect() throws SQLException {
public boolean autoReconnect(int count) throws SQLException {
if (!isClosed()) {
return false;
}
if (!autoReconnect || !autoCommit) {
return false;
}
if (count > SysProperties.MAX_RECONNECT) {
return false;
}
lastReconnect++;
embedded = connectEmbeddedOrServer();
if (embedded == this) {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论