From 2139c4da6e47e9011673c7c4f457951f1eeeeca5 Mon Sep 17 00:00:00 2001 From: Mark Michalek Date: Thu, 4 Apr 2019 14:44:40 -0400 Subject: [PATCH] 0003900: Improve performance of Oracle RAC routing processing --- .../symmetric/route/DataGapRouteReader.java | 26 ++++++++++++++----- 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/symmetric-core/src/main/java/org/jumpmind/symmetric/route/DataGapRouteReader.java b/symmetric-core/src/main/java/org/jumpmind/symmetric/route/DataGapRouteReader.java index 3126f4989c..7036dcc802 100644 --- a/symmetric-core/src/main/java/org/jumpmind/symmetric/route/DataGapRouteReader.java +++ b/symmetric-core/src/main/java/org/jumpmind/symmetric/route/DataGapRouteReader.java @@ -274,12 +274,7 @@ protected boolean process(Data data) { if (isEachGapQueried) { okToProcess = true; } else { - for (DataGap gap : dataGaps) { - if (dataId >= gap.getStartId() && dataId <= gap.getEndId()) { - okToProcess = true; - break; - } - } + okToProcess = isInDataGap(dataId); } } else { while (!okToProcess && currentGap != null && dataId >= currentGap.getStartId()) { @@ -298,6 +293,25 @@ protected boolean process(Data data) { } return okToProcess; } + + protected boolean isInDataGap(long dataId) { + // binary search algorithm + int start = 0; + int end = dataGaps.size() - 1; + while (start <= end) { + int mid = (start + end) / 2; + DataGap midGap = dataGaps.get(mid); + if (dataId >= midGap.getStartId() && dataId <= midGap.getEndId()) { + return true; + } + if (dataId< midGap.getStartId()) { + end = mid - 1; + } else { + start = mid + 1; + } + } + return false; + } public Data take() throws InterruptedException { Data data = null;