From 8f96cdf7d4c544df9bd3d37c32a10892002e3e2b Mon Sep 17 00:00:00 2001 From: Srdjan Stevanetic Date: Tue, 23 Apr 2024 13:29:35 +0200 Subject: [PATCH 1/4] load vocabularies into memory --- .../repository/VocabularyRepository.java | 24 ++++++++++++++++++- .../config/AppAutoconfig.java | 3 ++- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/entity-management-mongo/src/main/java/eu/europeana/entitymanagement/mongo/repository/VocabularyRepository.java b/entity-management-mongo/src/main/java/eu/europeana/entitymanagement/mongo/repository/VocabularyRepository.java index 5d142f62..8df974c6 100644 --- a/entity-management-mongo/src/main/java/eu/europeana/entitymanagement/mongo/repository/VocabularyRepository.java +++ b/entity-management-mongo/src/main/java/eu/europeana/entitymanagement/mongo/repository/VocabularyRepository.java @@ -18,13 +18,35 @@ public class VocabularyRepository { Datastore datastore; private static final String ID = "id"; + + private List vocabs = new ArrayList<>(); + public void loadIntoMemory() { + if(vocabs.isEmpty()) { + vocabs.addAll( + datastore.find(Vocabulary.class) + .iterator() + .toList()); + } + } + /** - * retrieve records by their id + * retrieve records by their id, from the in-memory collection * @param vocabularyIds * @return */ public List findByUri(List vocabularyIds) { + return vocabs.stream() + .filter(el -> vocabularyIds.contains(el.getId())) + .toList(); + } + + /** + * retrieve records by their id + * @param vocabularyIds + * @return + */ + public List findInDbByUri(List vocabularyIds) { List filters = new ArrayList<>(); filters.add(in(ID, vocabularyIds)); return datastore.find(Vocabulary.class) diff --git a/entity-management-web/src/main/java/eu/europeana/entitymanagement/config/AppAutoconfig.java b/entity-management-web/src/main/java/eu/europeana/entitymanagement/config/AppAutoconfig.java index 77b5bbbd..ce601873 100644 --- a/entity-management-web/src/main/java/eu/europeana/entitymanagement/config/AppAutoconfig.java +++ b/entity-management-web/src/main/java/eu/europeana/entitymanagement/config/AppAutoconfig.java @@ -86,7 +86,8 @@ public void ensureDatabaseInitialization() throws ApplicationInitializationExcep roles.add(vocab); } vocabRepository.saveBulk(roles); - } + } + vocabRepository.loadIntoMemory(); } @Bean(name = BEAN_EM_DATA_SOURCES) From 6ddfbfcb3f5144ca4581be9676de76ca02c1b926 Mon Sep 17 00:00:00 2001 From: Srdjan Stevanetic Date: Tue, 23 Apr 2024 14:15:50 +0200 Subject: [PATCH 2/4] loading vocabularies on first request (lazy loading) instead of on start-up --- .../mongo/repository/VocabularyRepository.java | 15 +++++++++------ .../entitymanagement/config/AppAutoconfig.java | 1 - 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/entity-management-mongo/src/main/java/eu/europeana/entitymanagement/mongo/repository/VocabularyRepository.java b/entity-management-mongo/src/main/java/eu/europeana/entitymanagement/mongo/repository/VocabularyRepository.java index 8df974c6..c5fd930e 100644 --- a/entity-management-mongo/src/main/java/eu/europeana/entitymanagement/mongo/repository/VocabularyRepository.java +++ b/entity-management-mongo/src/main/java/eu/europeana/entitymanagement/mongo/repository/VocabularyRepository.java @@ -19,24 +19,26 @@ public class VocabularyRepository { private static final String ID = "id"; - private List vocabs = new ArrayList<>(); + private List europeanaRoles; - public void loadIntoMemory() { - if(vocabs.isEmpty()) { - vocabs.addAll( + public List getEuropeanaRoles() { + if(europeanaRoles==null) { + europeanaRoles=new ArrayList<>(); + europeanaRoles.addAll( datastore.find(Vocabulary.class) .iterator() .toList()); } + return europeanaRoles; } - + /** * retrieve records by their id, from the in-memory collection * @param vocabularyIds * @return */ public List findByUri(List vocabularyIds) { - return vocabs.stream() + return getEuropeanaRoles().stream() .filter(el -> vocabularyIds.contains(el.getId())) .toList(); } @@ -87,4 +89,5 @@ public void dropCollection() { public long countRecords() { return datastore.find(Vocabulary.class).count(); } + } \ No newline at end of file diff --git a/entity-management-web/src/main/java/eu/europeana/entitymanagement/config/AppAutoconfig.java b/entity-management-web/src/main/java/eu/europeana/entitymanagement/config/AppAutoconfig.java index ce601873..27dc563d 100644 --- a/entity-management-web/src/main/java/eu/europeana/entitymanagement/config/AppAutoconfig.java +++ b/entity-management-web/src/main/java/eu/europeana/entitymanagement/config/AppAutoconfig.java @@ -87,7 +87,6 @@ public void ensureDatabaseInitialization() throws ApplicationInitializationExcep } vocabRepository.saveBulk(roles); } - vocabRepository.loadIntoMemory(); } @Bean(name = BEAN_EM_DATA_SOURCES) From 90008c6d0809fcab5d6517723fd88aff69889329 Mon Sep 17 00:00:00 2001 From: Srdjan Stevanetic Date: Tue, 23 Apr 2024 14:35:05 +0200 Subject: [PATCH 3/4] synchronized vocabulary loading --- .../repository/VocabularyRepository.java | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/entity-management-mongo/src/main/java/eu/europeana/entitymanagement/mongo/repository/VocabularyRepository.java b/entity-management-mongo/src/main/java/eu/europeana/entitymanagement/mongo/repository/VocabularyRepository.java index c5fd930e..c47cf260 100644 --- a/entity-management-mongo/src/main/java/eu/europeana/entitymanagement/mongo/repository/VocabularyRepository.java +++ b/entity-management-mongo/src/main/java/eu/europeana/entitymanagement/mongo/repository/VocabularyRepository.java @@ -23,19 +23,21 @@ public class VocabularyRepository { public List getEuropeanaRoles() { if(europeanaRoles==null) { - europeanaRoles=new ArrayList<>(); - europeanaRoles.addAll( - datastore.find(Vocabulary.class) - .iterator() - .toList()); + synchronized(this) { + europeanaRoles=new ArrayList<>(); + europeanaRoles.addAll( + datastore.find(Vocabulary.class) + .iterator() + .toList()); + } } return europeanaRoles; } /** * retrieve records by their id, from the in-memory collection - * @param vocabularyIds - * @return + * @param vocabularyIds ids to search for + * @return list of Vocabularies */ public List findByUri(List vocabularyIds) { return getEuropeanaRoles().stream() @@ -45,8 +47,8 @@ public List findByUri(List vocabularyIds) { /** * retrieve records by their id - * @param vocabularyIds - * @return + * @param vocabularyIds ids to search for + * @return list of Vocabularies */ public List findInDbByUri(List vocabularyIds) { List filters = new ArrayList<>(); From 9d4d0c7d01cfb40a15c427bb9d3e9b1a04dfc449 Mon Sep 17 00:00:00 2001 From: Srdjan Stevanetic Date: Tue, 23 Apr 2024 15:06:01 +0200 Subject: [PATCH 4/4] synchronized vocabularies loading improved --- .../mongo/repository/VocabularyRepository.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/entity-management-mongo/src/main/java/eu/europeana/entitymanagement/mongo/repository/VocabularyRepository.java b/entity-management-mongo/src/main/java/eu/europeana/entitymanagement/mongo/repository/VocabularyRepository.java index c47cf260..35526e71 100644 --- a/entity-management-mongo/src/main/java/eu/europeana/entitymanagement/mongo/repository/VocabularyRepository.java +++ b/entity-management-mongo/src/main/java/eu/europeana/entitymanagement/mongo/repository/VocabularyRepository.java @@ -22,16 +22,16 @@ public class VocabularyRepository { private List europeanaRoles; public List getEuropeanaRoles() { - if(europeanaRoles==null) { - synchronized(this) { + synchronized(this) { + if(europeanaRoles==null) { europeanaRoles=new ArrayList<>(); europeanaRoles.addAll( datastore.find(Vocabulary.class) .iterator() .toList()); } + return europeanaRoles; } - return europeanaRoles; } /**