提交 51806c13 编写于 作者: S serge-rider

#3415 Invalidate, connect, disconnect timeouts


Former-commit-id: 2c823e61
上级 6a7dd126
...@@ -160,7 +160,11 @@ public abstract class BaseSQLDialog extends BaseDialog { ...@@ -160,7 +160,11 @@ public abstract class BaseSQLDialog extends BaseDialog {
{ {
try { try {
this.sqlInput.setText(getSQLText()); this.sqlInput.setText(getSQLText());
sqlViewer.init(subSite, sqlInput); if (sqlViewer.getSite() != null) {
sqlViewer.setInput(sqlInput);
} else {
sqlViewer.init(subSite, sqlInput);
}
sqlViewer.reloadSyntaxRules(); sqlViewer.reloadSyntaxRules();
} catch (PartInitException e) { } catch (PartInitException e) {
DBUserInterface.getInstance().showError(getShell().getText(), null, e); DBUserInterface.getInstance().showError(getShell().getText(), null, e);
......
...@@ -22,10 +22,7 @@ import org.eclipse.core.runtime.IPath; ...@@ -22,10 +22,7 @@ import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Path;
import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.ui.IEditorPart; import org.eclipse.ui.*;
import org.eclipse.ui.IPathEditorInput;
import org.eclipse.ui.IPersistableElement;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.editors.text.IEncodingSupport; import org.eclipse.ui.editors.text.IEncodingSupport;
import org.jkiss.code.Nullable; import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.DBException;
...@@ -390,7 +387,11 @@ public class ContentEditorInput implements IPathEditorInput, DBPContextProvider, ...@@ -390,7 +387,11 @@ public class ContentEditorInput implements IPathEditorInput, DBPContextProvider,
this.fileCharset = fileCharset; this.fileCharset = fileCharset;
for (IEditorPart part : editorParts) { for (IEditorPart part : editorParts) {
try { try {
part.init(part.getEditorSite(), this); if (part instanceof IReusableEditor) {
((IReusableEditor) part).setInput(this);
} else {
part.init(part.getEditorSite(), this);
}
} catch (PartInitException e) { } catch (PartInitException e) {
log.error("Error refreshing content editor part " + part, e); log.error("Error refreshing content editor part " + part, e);
} }
......
...@@ -46,6 +46,10 @@ public final class ModelPreferences ...@@ -46,6 +46,10 @@ public final class ModelPreferences
public static final String EXECUTE_RECOVER_ENABLED = "execute.recover.enabled"; //$NON-NLS-1$ public static final String EXECUTE_RECOVER_ENABLED = "execute.recover.enabled"; //$NON-NLS-1$
public static final String EXECUTE_RECOVER_RETRY_COUNT = "execute.recover.retryCount"; //$NON-NLS-1$ public static final String EXECUTE_RECOVER_RETRY_COUNT = "execute.recover.retryCount"; //$NON-NLS-1$
public static final String CONNECTION_OPEN_TIMEOUT = "connection.open.timeout"; //$NON-NLS-1$
public static final String CONNECTION_VALIDATION_TIMEOUT = "connection.validation.timeout"; //$NON-NLS-1$
public static final String CONNECTION_CLOSE_TIMEOUT = "connection.close.timeout"; //$NON-NLS-1$
public static final String SCRIPT_STATEMENT_DELIMITER = "script.sql.delimiter"; //$NON-NLS-1$ public static final String SCRIPT_STATEMENT_DELIMITER = "script.sql.delimiter"; //$NON-NLS-1$
public static final String SCRIPT_IGNORE_NATIVE_DELIMITER = "script.sql.ignoreNativeDelimiter"; //$NON-NLS-1$ public static final String SCRIPT_IGNORE_NATIVE_DELIMITER = "script.sql.ignoreNativeDelimiter"; //$NON-NLS-1$
public static final String SCRIPT_STATEMENT_DELIMITER_BLANK = "script.sql.delimiter.blank"; //$NON-NLS-1$ public static final String SCRIPT_STATEMENT_DELIMITER_BLANK = "script.sql.delimiter.blank"; //$NON-NLS-1$
...@@ -124,6 +128,10 @@ public final class ModelPreferences ...@@ -124,6 +128,10 @@ public final class ModelPreferences
PrefUtils.setDefaultPreferenceValue(store, EXECUTE_RECOVER_ENABLED, true); PrefUtils.setDefaultPreferenceValue(store, EXECUTE_RECOVER_ENABLED, true);
PrefUtils.setDefaultPreferenceValue(store, EXECUTE_RECOVER_RETRY_COUNT, 1); PrefUtils.setDefaultPreferenceValue(store, EXECUTE_RECOVER_RETRY_COUNT, 1);
PrefUtils.setDefaultPreferenceValue(store, CONNECTION_OPEN_TIMEOUT, 20000);
PrefUtils.setDefaultPreferenceValue(store, CONNECTION_VALIDATION_TIMEOUT, 5000);
PrefUtils.setDefaultPreferenceValue(store, CONNECTION_CLOSE_TIMEOUT, 5000);
// SQL execution // SQL execution
PrefUtils.setDefaultPreferenceValue(store, SCRIPT_STATEMENT_DELIMITER, SQLConstants.DEFAULT_STATEMENT_DELIMITER); PrefUtils.setDefaultPreferenceValue(store, SCRIPT_STATEMENT_DELIMITER, SQLConstants.DEFAULT_STATEMENT_DELIMITER);
PrefUtils.setDefaultPreferenceValue(store, SCRIPT_IGNORE_NATIVE_DELIMITER, false); PrefUtils.setDefaultPreferenceValue(store, SCRIPT_IGNORE_NATIVE_DELIMITER, false);
......
...@@ -37,7 +37,6 @@ import org.jkiss.dbeaver.model.impl.jdbc.exec.JDBCFactoryDefault; ...@@ -37,7 +37,6 @@ import org.jkiss.dbeaver.model.impl.jdbc.exec.JDBCFactoryDefault;
import org.jkiss.dbeaver.model.messages.ModelMessages; import org.jkiss.dbeaver.model.messages.ModelMessages;
import org.jkiss.dbeaver.model.meta.Property; import org.jkiss.dbeaver.model.meta.Property;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.runtime.DBRRunnableWithProgress;
import org.jkiss.dbeaver.model.sql.SQLDataSource; import org.jkiss.dbeaver.model.sql.SQLDataSource;
import org.jkiss.dbeaver.model.sql.SQLDialect; import org.jkiss.dbeaver.model.sql.SQLDialect;
import org.jkiss.dbeaver.model.sql.SQLState; import org.jkiss.dbeaver.model.sql.SQLState;
...@@ -48,7 +47,6 @@ import org.jkiss.dbeaver.utils.GeneralUtils; ...@@ -48,7 +47,6 @@ import org.jkiss.dbeaver.utils.GeneralUtils;
import org.jkiss.dbeaver.utils.RuntimeUtils; import org.jkiss.dbeaver.utils.RuntimeUtils;
import org.jkiss.utils.CommonUtils; import org.jkiss.utils.CommonUtils;
import java.lang.reflect.InvocationTargetException;
import java.net.SocketException; import java.net.SocketException;
import java.sql.*; import java.sql.*;
import java.util.ArrayList; import java.util.ArrayList;
...@@ -74,8 +72,6 @@ public abstract class JDBCDataSource ...@@ -74,8 +72,6 @@ public abstract class JDBCDataSource
{ {
private static final Log log = Log.getLog(JDBCDataSource.class); private static final Log log = Log.getLog(JDBCDataSource.class);
public static final int DISCONNECT_TIMEOUT = 5000;
@NotNull @NotNull
private final DBPDataSourceContainer container; private final DBPDataSourceContainer container;
@NotNull @NotNull
...@@ -143,22 +139,34 @@ public abstract class JDBCDataSource ...@@ -143,22 +139,34 @@ public abstract class JDBCDataSource
} }
} }
monitor.subTask("Connecting " + purpose); monitor.subTask("Connecting " + purpose);
Connection connection; Connection[] connection = new Connection[1];
if (driverInstance == null) { Exception[] error = new Exception[1];
connection = DriverManager.getConnection(url, connectProps); int openTimeout = getContainer().getPreferenceStore().getInt(ModelPreferences.CONNECTION_OPEN_TIMEOUT);
} else {
connection = driverInstance.connect(url, connectProps); RuntimeUtils.runTask(monitor1 -> {
try {
if (driverInstance == null) {
connection[0] = DriverManager.getConnection(url, connectProps);
} else {
connection[0] = driverInstance.connect(url, connectProps);
}
} catch (Exception e) {
error[0] = e;
}
}, "Check connection is alive", openTimeout + 2000);
if (error[0] != null) {
throw error[0];
} }
if (connection == null) { if (connection[0] == null) {
throw new DBCException("Null connection returned"); throw new DBCException("Null connection returned");
} }
// Set read-only flag // Set read-only flag
if (container.isConnectionReadOnly() && !isConnectionReadOnlyBroken()) { if (container.isConnectionReadOnly() && !isConnectionReadOnlyBroken()) {
connection.setReadOnly(true); connection[0].setReadOnly(true);
} }
return connection; return connection[0];
} }
catch (SQLException ex) { catch (SQLException ex) {
throw new DBCConnectException(ex.getMessage(), ex, this); throw new DBCConnectException(ex.getMessage(), ex, this);
...@@ -216,28 +224,26 @@ public abstract class JDBCDataSource ...@@ -216,28 +224,26 @@ public abstract class JDBCDataSource
{ {
if (connection != null) { if (connection != null) {
// Close datasource (in async task) // Close datasource (in async task)
RuntimeUtils.runTask(new DBRRunnableWithProgress() { RuntimeUtils.runTask(monitor -> {
@Override try {
public void run(DBRProgressMonitor monitor) throws InvocationTargetException, InterruptedException { // If we in transaction - rollback it.
try { // Any valuable transaction changes should be committed by UI
// If we in transaction - rollback it. // so here we do it just in case to avoid error messages on close with open transaction
// Any valuable transaction changes should be committed by UI if (!connection.getAutoCommit()) {
// so here we do it just in case to avoid error messages on close with open transaction connection.rollback();
if (!connection.getAutoCommit()) {
connection.rollback();
}
} catch (Throwable e) {
// Do not write warning because connection maybe broken before the moment of close
log.debug("Error closing transaction", e);
}
try {
connection.close();
}
catch (Throwable ex) {
log.error("Error closing connection", ex);
} }
} catch (Throwable e) {
// Do not write warning because connection maybe broken before the moment of close
log.debug("Error closing transaction", e);
}
try {
connection.close();
}
catch (Throwable ex) {
log.error("Error closing connection", ex);
} }
}, "Close JDBC connection (" + purpose + ")", DISCONNECT_TIMEOUT); }, "Close JDBC connection (" + purpose + ")",
getContainer().getPreferenceStore().getInt(ModelPreferences.CONNECTION_CLOSE_TIMEOUT));
} }
} }
......
...@@ -20,6 +20,7 @@ import org.jkiss.code.NotNull; ...@@ -20,6 +20,7 @@ import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable; import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.ModelPreferences;
import org.jkiss.dbeaver.model.DBPDataKind; import org.jkiss.dbeaver.model.DBPDataKind;
import org.jkiss.dbeaver.model.DBPDataSource; import org.jkiss.dbeaver.model.DBPDataSource;
import org.jkiss.dbeaver.model.DBPDataTypeProvider; import org.jkiss.dbeaver.model.DBPDataTypeProvider;
...@@ -36,6 +37,7 @@ import org.jkiss.dbeaver.model.sql.SQLDataSource; ...@@ -36,6 +37,7 @@ import org.jkiss.dbeaver.model.sql.SQLDataSource;
import org.jkiss.dbeaver.model.sql.SQLUtils; import org.jkiss.dbeaver.model.sql.SQLUtils;
import org.jkiss.dbeaver.model.struct.DBSObjectFilter; import org.jkiss.dbeaver.model.struct.DBSObjectFilter;
import org.jkiss.dbeaver.model.struct.rdb.DBSForeignKeyModifyRule; import org.jkiss.dbeaver.model.struct.rdb.DBSForeignKeyModifyRule;
import org.jkiss.dbeaver.utils.RuntimeUtils;
import org.jkiss.utils.CommonUtils; import org.jkiss.utils.CommonUtils;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
...@@ -50,7 +52,6 @@ import java.util.Map; ...@@ -50,7 +52,6 @@ import java.util.Map;
*/ */
public class JDBCUtils { public class JDBCUtils {
private static final Log log = Log.getLog(JDBCUtils.class); private static final Log log = Log.getLog(JDBCUtils.class);
public static final int CONNECTION_VALIDATION_TIMEOUT = 5000;
private static final Map<String, Integer> badColumnNames = new HashMap<>(); private static final Map<String, Integer> badColumnNames = new HashMap<>();
...@@ -479,30 +480,36 @@ public class JDBCUtils { ...@@ -479,30 +480,36 @@ public class JDBCUtils {
log.debug(e); log.debug(e);
return false; return false;
} }
String testSQL = null; final String testSQL = (dataSource instanceof SQLDataSource) ?
if (dataSource instanceof SQLDataSource) { ((SQLDataSource) dataSource).getSQLDialect().getTestSQL() : null;
testSQL = ((SQLDataSource) dataSource).getSQLDialect().getTestSQL(); int invalidateTimeout = dataSource.getContainer().getPreferenceStore().getInt(ModelPreferences.CONNECTION_VALIDATION_TIMEOUT);
}
try { // Invalidate in non-blocking task.
if (!CommonUtils.isEmpty(testSQL)) { // Timeout is CONNECTION_VALIDATION_TIMEOUT + 2 seconds
// Execute test SQL final boolean[] isValid = new boolean[1];
try (Statement dbStat = connection.createStatement()) { RuntimeUtils.runTask(monitor -> {
dbStat.execute(testSQL); try {
} if (!CommonUtils.isEmpty(testSQL)) {
} else { // Execute test SQL
try { try (Statement dbStat = connection.createStatement()) {
return connection.isValid(CONNECTION_VALIDATION_TIMEOUT); dbStat.execute(testSQL);
} catch (Throwable e) { isValid[0] = true;
// isValid may be unsupported by driver }
// Let's try to read table list } else {
connection.getMetaData().getTables(null, null, "DBEAVER_FAKE_TABLE_NAME_FOR_PING", null); try {
isValid[0] = connection.isValid(invalidateTimeout);
} catch (Throwable e) {
// isValid may be unsupported by driver
// Let's try to read table list
connection.getMetaData().getTables(null, null, "DBEAVER_FAKE_TABLE_NAME_FOR_PING", null);
isValid[0] = true;
}
} }
} catch (SQLException e) {
isValid[0] = false;
} }
return true; }, "Check connection is alive", invalidateTimeout + 2000);
} catch (Throwable e1) { return isValid[0];
log.debug("Connection seems to be broken", e1);
return false;
}
} }
public static void scrollResultSet(ResultSet dbResult, long offset, boolean forceFetch) throws SQLException public static void scrollResultSet(ResultSet dbResult, long offset, boolean forceFetch) throws SQLException
......
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
package org.jkiss.dbeaver.model.impl.net; package org.jkiss.dbeaver.model.impl.net;
import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.model.DBPDataSource;
import org.jkiss.dbeaver.model.app.DBPPlatform; import org.jkiss.dbeaver.model.app.DBPPlatform;
import org.jkiss.dbeaver.model.connection.DBPConnectionConfiguration; import org.jkiss.dbeaver.model.connection.DBPConnectionConfiguration;
import org.jkiss.dbeaver.model.net.DBWHandlerConfiguration; import org.jkiss.dbeaver.model.net.DBWHandlerConfiguration;
...@@ -48,7 +49,7 @@ public class HTTPTunnelImpl implements DBWTunnel { ...@@ -48,7 +49,7 @@ public class HTTPTunnelImpl implements DBWTunnel {
} }
@Override @Override
public void invalidateHandler(DBRProgressMonitor monitor) throws DBException, IOException { public void invalidateHandler(DBRProgressMonitor monitor, DBPDataSource dataSource) throws DBException, IOException {
} }
......
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
package org.jkiss.dbeaver.model.impl.net; package org.jkiss.dbeaver.model.impl.net;
import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.model.DBPDataSource;
import org.jkiss.dbeaver.model.net.DBWConfigProvider; import org.jkiss.dbeaver.model.net.DBWConfigProvider;
import org.jkiss.dbeaver.model.net.DBWNetworkHandler; import org.jkiss.dbeaver.model.net.DBWNetworkHandler;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
...@@ -28,7 +29,7 @@ import java.io.IOException; ...@@ -28,7 +29,7 @@ import java.io.IOException;
*/ */
public class SSLHandlerImpl implements DBWNetworkHandler, DBWConfigProvider { public class SSLHandlerImpl implements DBWNetworkHandler, DBWConfigProvider {
@Override @Override
public void invalidateHandler(DBRProgressMonitor monitor) throws DBException, IOException { public void invalidateHandler(DBRProgressMonitor monitor, DBPDataSource dataSource) throws DBException, IOException {
} }
} }
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
package org.jkiss.dbeaver.model.impl.net; package org.jkiss.dbeaver.model.impl.net;
import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.model.DBPDataSource;
import org.jkiss.dbeaver.model.net.DBWNetworkHandler; import org.jkiss.dbeaver.model.net.DBWNetworkHandler;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
...@@ -29,7 +30,7 @@ public class SocksProxyImpl implements DBWNetworkHandler { ...@@ -29,7 +30,7 @@ public class SocksProxyImpl implements DBWNetworkHandler {
@Override @Override
public void invalidateHandler(DBRProgressMonitor monitor) throws DBException, IOException { public void invalidateHandler(DBRProgressMonitor monitor, DBPDataSource dataSource) throws DBException, IOException {
} }
} }
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
package org.jkiss.dbeaver.model.net; package org.jkiss.dbeaver.model.net;
import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.model.DBPDataSource;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import java.io.IOException; import java.io.IOException;
...@@ -26,7 +27,7 @@ import java.io.IOException; ...@@ -26,7 +27,7 @@ import java.io.IOException;
*/ */
public interface DBWNetworkHandler { public interface DBWNetworkHandler {
void invalidateHandler(DBRProgressMonitor monitor) void invalidateHandler(DBRProgressMonitor monitor, DBPDataSource dataSource)
throws DBException, IOException; throws DBException, IOException;
} }
...@@ -27,7 +27,6 @@ import org.jkiss.dbeaver.model.net.DBWNetworkHandler; ...@@ -27,7 +27,6 @@ import org.jkiss.dbeaver.model.net.DBWNetworkHandler;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.runtime.DBeaverNotifications; import org.jkiss.dbeaver.runtime.DBeaverNotifications;
import org.jkiss.dbeaver.runtime.ui.DBUserInterface; import org.jkiss.dbeaver.runtime.ui.DBUserInterface;
import org.jkiss.dbeaver.utils.RuntimeUtils;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
...@@ -96,7 +95,7 @@ public class InvalidateJob extends DataSourceJob ...@@ -96,7 +95,7 @@ public class InvalidateJob extends DataSourceJob
for (DBWNetworkHandler nh : activeHandlers) { for (DBWNetworkHandler nh : activeHandlers) {
monitor.subTask("Invalidate network [" + container.getName() + "]"); monitor.subTask("Invalidate network [" + container.getName() + "]");
try { try {
nh.invalidateHandler(monitor); nh.invalidateHandler(monitor, dataSource);
} catch (Exception e) { } catch (Exception e) {
invalidateResults.add(new ContextInvalidateResult(DBCExecutionContext.InvalidateResult.ERROR, e)); invalidateResults.add(new ContextInvalidateResult(DBCExecutionContext.InvalidateResult.ERROR, e));
networkOK = false; networkOK = false;
......
...@@ -17,6 +17,9 @@ ...@@ -17,6 +17,9 @@
package org.jkiss.dbeaver.model.net.ssh; package org.jkiss.dbeaver.model.net.ssh;
import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.ModelPreferences;
import org.jkiss.dbeaver.model.DBPDataSource;
import org.jkiss.dbeaver.model.app.DBPPlatform; import org.jkiss.dbeaver.model.app.DBPPlatform;
import org.jkiss.dbeaver.model.connection.DBPConnectionConfiguration; import org.jkiss.dbeaver.model.connection.DBPConnectionConfiguration;
import org.jkiss.dbeaver.model.net.DBWHandlerConfiguration; import org.jkiss.dbeaver.model.net.DBWHandlerConfiguration;
...@@ -24,6 +27,7 @@ import org.jkiss.dbeaver.model.net.DBWTunnel; ...@@ -24,6 +27,7 @@ import org.jkiss.dbeaver.model.net.DBWTunnel;
import org.jkiss.dbeaver.model.net.ssh.registry.SSHImplementationDescriptor; import org.jkiss.dbeaver.model.net.ssh.registry.SSHImplementationDescriptor;
import org.jkiss.dbeaver.model.net.ssh.registry.SSHImplementationRegistry; import org.jkiss.dbeaver.model.net.ssh.registry.SSHImplementationRegistry;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.utils.RuntimeUtils;
import org.jkiss.utils.CommonUtils; import org.jkiss.utils.CommonUtils;
import java.io.IOException; import java.io.IOException;
...@@ -34,6 +38,7 @@ import java.util.Map; ...@@ -34,6 +38,7 @@ import java.util.Map;
*/ */
public class SSHTunnelImpl implements DBWTunnel { public class SSHTunnelImpl implements DBWTunnel {
private static final Log log = Log.getLog(SSHTunnelImpl.class);
private static final String DEF_IMPLEMENTATION = "jsch"; private static final String DEF_IMPLEMENTATION = "jsch";
private SSHImplementation implementation; private SSHImplementation implementation;
...@@ -97,9 +102,17 @@ public class SSHTunnelImpl implements DBWTunnel { ...@@ -97,9 +102,17 @@ public class SSHTunnelImpl implements DBWTunnel {
} }
@Override @Override
public void invalidateHandler(DBRProgressMonitor monitor) throws DBException, IOException { public void invalidateHandler(DBRProgressMonitor monitor, DBPDataSource dataSource) throws DBException, IOException {
if (implementation != null) { if (implementation != null) {
implementation.invalidateTunnel(monitor); RuntimeUtils.runTask(monitor1 -> {
try {
implementation.invalidateTunnel(monitor1);
} catch (Exception e) {
log.error("Error invalidating SSH tunnel", e);
}
},
"Check connection is alive",
dataSource.getContainer().getPreferenceStore().getInt(ModelPreferences.CONNECTION_VALIDATION_TIMEOUT));
} }
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册