From d02bed1a553d5f966b09834cfe0de30e255e8969 Mon Sep 17 00:00:00 2001 From: Viktor Lofgren Date: Mon, 18 Dec 2023 13:15:10 +0100 Subject: [PATCH] (loader) Optimize DomainLoaderService for faster startups Initialization parameters in DomainLoaderService and DomainIdRegistry have been updated to improve performance. This is done by adding sane default sizes to the hash tables involved, reducing GC churn, but also by setting a sensible fetch size to the queries used, and not fetching irrelevant information such as the domain name. --- .../nu/marginalia/loading/domains/DomainIdRegistry.java | 2 +- .../nu/marginalia/loading/domains/DomainLoaderService.java | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/code/processes/loading-process/src/main/java/nu/marginalia/loading/domains/DomainIdRegistry.java b/code/processes/loading-process/src/main/java/nu/marginalia/loading/domains/DomainIdRegistry.java index 2ab6ba46..bccc3ed3 100644 --- a/code/processes/loading-process/src/main/java/nu/marginalia/loading/domains/DomainIdRegistry.java +++ b/code/processes/loading-process/src/main/java/nu/marginalia/loading/domains/DomainIdRegistry.java @@ -5,7 +5,7 @@ import java.util.Map; /** Maps domain names to domain ids */ public class DomainIdRegistry { - private final Map domainIds = new HashMap<>(); + private final Map domainIds = new HashMap<>(10_000); public int getDomainId(String domainName) { Integer id = domainIds.get(domainName.toLowerCase()); diff --git a/code/processes/loading-process/src/main/java/nu/marginalia/loading/domains/DomainLoaderService.java b/code/processes/loading-process/src/main/java/nu/marginalia/loading/domains/DomainLoaderService.java index fa34e07c..6739f8e7 100644 --- a/code/processes/loading-process/src/main/java/nu/marginalia/loading/domains/DomainLoaderService.java +++ b/code/processes/loading-process/src/main/java/nu/marginalia/loading/domains/DomainLoaderService.java @@ -42,12 +42,12 @@ public class DomainLoaderService { public DomainIdRegistry getOrCreateDomainIds(LoaderInputData inputData) throws IOException, SQLException { - Set domainNamesAll = new HashSet<>(); + Set domainNamesAll = new HashSet<>(100_000); DomainIdRegistry ret = new DomainIdRegistry(); try (var conn = dataSource.getConnection(); var selectStmt = conn.prepareStatement(""" - SELECT ID, DOMAIN_NAME FROM EC_DOMAIN WHERE DOMAIN_NAME=? + SELECT ID FROM EC_DOMAIN WHERE DOMAIN_NAME=? """) ) { @@ -70,6 +70,7 @@ public class DomainLoaderService { } } + selectStmt.setFetchSize(1000); for (var domain : domainNamesAll) { selectStmt.setString(1, domain); var rs = selectStmt.executeQuery(); @@ -133,7 +134,7 @@ public class DomainLoaderService { return true; } - private class DomainInserter implements AutoCloseable { + private static class DomainInserter implements AutoCloseable { private final PreparedStatement statement; private final int nodeAffinity;