From 02dfb4bd8a29dd7b83a34130cce956f2d910b9cf Mon Sep 17 00:00:00 2001 From: Alexander Schwartz Date: Wed, 15 Oct 2025 12:39:49 +0200 Subject: [PATCH] Remove extra flush events to increase performance Closes #43362 Signed-off-by: Alexander Schwartz --- .../keycloak/models/jpa/JpaRealmProvider.java | 39 ++++++++++--------- .../org/keycloak/models/jpa/RealmAdapter.java | 1 - 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/model/jpa/src/main/java/org/keycloak/models/jpa/JpaRealmProvider.java b/model/jpa/src/main/java/org/keycloak/models/jpa/JpaRealmProvider.java index d8bdd506dca..be759fad02c 100644 --- a/model/jpa/src/main/java/org/keycloak/models/jpa/JpaRealmProvider.java +++ b/model/jpa/src/main/java/org/keycloak/models/jpa/JpaRealmProvider.java @@ -1320,24 +1320,27 @@ public class JpaRealmProvider implements RealmProvider, ClientProvider, ClientSc Map existingClientScopes = getClientScopes(realm, client, true); existingClientScopes.putAll(getClientScopes(realm, client, false)); - clientScopes.stream() - .filter(clientScope -> !existingClientScopes.containsKey(clientScope.getName())) - .filter(clientScope -> { - if (clientScope.getProtocol() == null) { - // set default protocol if not set. Otherwise, we will get a NullPointer - clientScope.setProtocol(OIDCLoginProtocol.LOGIN_PROTOCOL); - } - return acceptedClientProtocols.contains(clientScope.getProtocol()); - }) - .forEach(clientScope -> { - ClientScopeClientMappingEntity entity = new ClientScopeClientMappingEntity(); - entity.setClientScopeId(clientScope.getId()); - entity.setClientId(client.getId()); - entity.setDefaultScope(defaultScope); - em.persist(entity); - em.flush(); - em.detach(entity); - }); + Set clientScopeEntities = clientScopes.stream() + .filter(clientScope -> !existingClientScopes.containsKey(clientScope.getName())) + .filter(clientScope -> { + if (clientScope.getProtocol() == null) { + // set default protocol if not set. Otherwise, we will get a NullPointer + clientScope.setProtocol(OIDCLoginProtocol.LOGIN_PROTOCOL); + } + return acceptedClientProtocols.contains(clientScope.getProtocol()); + }) + .map(clientScope -> { + ClientScopeClientMappingEntity entity = new ClientScopeClientMappingEntity(); + entity.setClientScopeId(clientScope.getId()); + entity.setClientId(client.getId()); + entity.setDefaultScope(defaultScope); + em.persist(entity); + return entity; + }).collect(Collectors.toSet()); + if (!clientScopeEntities.isEmpty()) { + em.flush(); + clientScopeEntities.forEach(entity -> em.detach(entity)); + } } @Override diff --git a/model/jpa/src/main/java/org/keycloak/models/jpa/RealmAdapter.java b/model/jpa/src/main/java/org/keycloak/models/jpa/RealmAdapter.java index c027de116a5..f76211ebb64 100755 --- a/model/jpa/src/main/java/org/keycloak/models/jpa/RealmAdapter.java +++ b/model/jpa/src/main/java/org/keycloak/models/jpa/RealmAdapter.java @@ -1854,7 +1854,6 @@ public class RealmAdapter implements StorageProviderRealmModel, JpaModel