Skip to content

Commit e77e1f5

Browse files
authored
perf: avoid creating monitor plugin chains when unnecessary (#1530)
1 parent 2b93e94 commit e77e1f5

File tree

1 file changed

+33
-18
lines changed

1 file changed

+33
-18
lines changed

wrapper/src/main/java/software/amazon/jdbc/util/monitoring/MonitorServiceImpl.java

Lines changed: 33 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,11 @@
1717
package software.amazon.jdbc.util.monitoring;
1818

1919
import java.sql.SQLException;
20+
import java.util.ArrayList;
2021
import java.util.Collections;
2122
import java.util.HashMap;
2223
import java.util.HashSet;
24+
import java.util.List;
2325
import java.util.Map;
2426
import java.util.Properties;
2527
import java.util.Set;
@@ -197,25 +199,38 @@ public <T extends Monitor> T runIfAbsent(
197199
cacheContainer = monitorCaches.computeIfAbsent(monitorClass, k -> supplier.get());
198200
}
199201

200-
final ConnectionService connectionService =
201-
getConnectionService(
202-
storageService,
203-
telemetryFactory,
204-
defaultConnectionProvider,
205-
originalUrl,
206-
driverProtocol,
207-
driverDialect,
208-
dbDialect,
209-
originalProps);
210-
211-
Monitor monitor = cacheContainer.getCache().computeIfAbsent(key, k -> {
212-
MonitorItem monitorItem = new MonitorItem(() -> initializer.createMonitor(
213-
connectionService,
214-
connectionService.getPluginService()));
215-
monitorItem.getMonitor().start();
216-
return monitorItem;
217-
}).getMonitor();
202+
// Lambdas require references to outer variables to be final. We use this variable to check whether a SQLException
203+
// occurred while attempting to create the monitor.
204+
final List<SQLException> exceptionList = new ArrayList<>(1);
205+
MonitorItem monitorItem = cacheContainer.getCache().computeIfAbsent(key, k -> {
206+
try {
207+
final ConnectionService connectionService =
208+
getConnectionService(
209+
storageService,
210+
telemetryFactory,
211+
defaultConnectionProvider,
212+
originalUrl,
213+
driverProtocol,
214+
driverDialect,
215+
dbDialect,
216+
originalProps);
217+
final MonitorItem monitorItemInner = new MonitorItem(() -> initializer.createMonitor(
218+
connectionService,
219+
connectionService.getPluginService())
220+
);
221+
monitorItemInner.getMonitor().start();
222+
return monitorItemInner;
223+
} catch (SQLException e) {
224+
exceptionList.add(e);
225+
return null;
226+
}
227+
});
228+
229+
if (!exceptionList.isEmpty()) {
230+
throw exceptionList.get(0);
231+
}
218232

233+
Monitor monitor = monitorItem.getMonitor();
219234
if (monitorClass.isInstance(monitor)) {
220235
return monitorClass.cast(monitor);
221236
}

0 commit comments

Comments
 (0)