diff --git a/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetPersister.java b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetPersister.java index 6784bf73a8145f920f1583e6c1ab72de4a1490ac..2c06bfef6fd8ef5c38534a652c67f4713c8ff92a 100644 --- a/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetPersister.java +++ b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetPersister.java @@ -1022,6 +1022,9 @@ class ResultSetPersister { @Override protected IStatus run(DBRProgressMonitor monitor) { + if (!viewer.acquireDataReadLock()) { + return Status.CANCEL_STATUS; + } monitor.beginTask("Refresh updated rows", 1); try { final Object[][] refreshValues = new Object[rows.size()][]; @@ -1090,6 +1093,7 @@ class ResultSetPersister { } } finally { monitor.done(); + viewer.releaseDataReadLock(); } return Status.OK_STATUS; } diff --git a/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetViewer.java b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetViewer.java index 868f417e9ebae8bc68ae8b40e031cc2b4a1acbae..88d353018602674d9888c2731fb379681b20f078 100644 --- a/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetViewer.java +++ b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetViewer.java @@ -3695,6 +3695,26 @@ public class ResultSetViewer extends Viewer } } + void releaseDataReadLock() { + synchronized (dataPumpJobQueue) { + if (!dataPumpRunning.get()) { + log.debug("Internal error: data read status is empty"); + } + dataPumpRunning.set(false); + } + } + + boolean acquireDataReadLock() { + synchronized (dataPumpJobQueue) { + if (dataPumpRunning.get()) { + log.debug("Internal error: multiple data reads started (" + dataPumpJobQueue + ")"); + return false; + } + dataPumpRunning.set(true); + } + return true; + } + public void clearData() { this.model.releaseAllData(); @@ -4413,12 +4433,8 @@ public class ResultSetViewer extends Viewer @Override protected IStatus run(DBRProgressMonitor monitor) { - synchronized (dataPumpJobQueue) { - if (dataPumpRunning.get()) { - log.debug("Internal error: multiple data reads started (" + dataPumpJobQueue + ")"); - return Status.CANCEL_STATUS; - } - dataPumpRunning.set(true); + if (!acquireDataReadLock()) { + return Status.CANCEL_STATUS; } beforeDataRead(); try { @@ -4426,12 +4442,7 @@ public class ResultSetViewer extends Viewer afterDataRead(); return status; } finally { - synchronized (dataPumpJobQueue) { - if (!dataPumpRunning.get()) { - log.debug("Internal error: data read status is empty"); - } - dataPumpRunning.set(false); - } + releaseDataReadLock(); } } @@ -4559,4 +4570,5 @@ public class ResultSetViewer extends Viewer }); } } + }