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

New system property h2.maxReconnect.

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