提交 ca0adb35 编写于 作者: S Serge Rider

#10101 Force cancel - do now ask for confirmation + connection double-close check added

上级 bd1ec1a5
......@@ -51,10 +51,7 @@ import org.jkiss.utils.CommonUtils;
import java.net.SocketException;
import java.sql.*;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.*;
/**
* JDBC data source
......@@ -84,6 +81,8 @@ public abstract class JDBCDataSource
private int databaseMajorVersion;
private int databaseMinorVersion;
private final transient List<Connection> closingConnections = new ArrayList<>();
protected JDBCDataSource(@NotNull DBRProgressMonitor monitor, @NotNull DBPDataSourceContainer container, @NotNull SQLDialect dialect)
throws DBException
{
......@@ -278,6 +277,12 @@ public abstract class JDBCDataSource
public boolean closeConnection(final Connection connection, String purpose, boolean doRollback)
{
if (connection != null) {
synchronized (closingConnections) {
if (closingConnections.contains(connection)) {
return true;
}
closingConnections.add(connection);
}
// Close datasource (in async task)
return RuntimeUtils.runTask(monitor -> {
if (doRollback) {
......@@ -299,6 +304,10 @@ public abstract class JDBCDataSource
catch (Throwable ex) {
log.debug("Error closing connection", ex);
}
synchronized (closingConnections) {
closingConnections.remove(connection);
}
}, "Close JDBC connection (" + purpose + ")",
getContainer().getPreferenceStore().getInt(ModelPreferences.CONNECTION_CLOSE_TIMEOUT));
} else {
......
......@@ -20,17 +20,14 @@ import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.progress.UIJob;
import org.jkiss.dbeaver.ModelPreferences;
import org.jkiss.dbeaver.model.DBPDataSource;
import org.jkiss.dbeaver.model.data.DBDDataFilter;
import org.jkiss.dbeaver.model.exec.*;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.runtime.load.ILoadService;
import org.jkiss.dbeaver.model.struct.DBSDataContainer;
import org.jkiss.dbeaver.runtime.jobs.DisconnectJob;
import org.jkiss.dbeaver.ui.UIUtils;
import org.jkiss.dbeaver.ui.controls.ProgressLoaderVisualizer;
import org.jkiss.dbeaver.ui.controls.resultset.internal.ResultSetMessages;
......@@ -175,29 +172,16 @@ abstract class ResultSetJobDataRead extends ResultSetJobAbstract implements ILoa
long cancelTimeout = controller.getPreferenceStore().getLong(ResultSetPreferences.RESULT_SET_CANCEL_TIMEOUT);
if (cancelTimeout > 0 && System.currentTimeMillis() - cancelTimestamp > cancelTimeout) {
// Job was canceled but didn't end.
// Something went wrong but we don't want to block UI
// Connection was canceled then lets just finish the pump job.
// Let's ask user about cancel force
if (UIUtils.confirmAction(
getDisplay().getActiveShell(),
"Database not responding",
"Database driver is not responding.\nDo you want to cancel request and close connection?",
SWT.ICON_WARNING))
{
// Run datasource invalidation
DBPDataSource dataSource = dataContainer.getDataSource();
if (dataSource != null) {
new DisconnectJob(dataSource.getContainer()).schedule();
}
// So let's just ignore active job (remove from queue and stop visualizing)
controller.removeDataPump(loadService);
loadService.forceDataReadCancel(new DBCException("Cancel operation timed out"));
visualizer.completeLoading(null);
visualizer.visualizeLoading();
return Status.OK_STATUS;
}
controller.removeDataPump(loadService);
loadService.forceDataReadCancel(new DBCException("Cancel operation timed out"));
visualizer.completeLoading(null);
visualizer.visualizeLoading();
return Status.OK_STATUS;
}
}
if (!controller.getDataReceiver().isDataReceivePaused()) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册