From d9bf511406a00ca02822e8f2ffc1010b3deec1c3 Mon Sep 17 00:00:00 2001 From: Kashif Saadat Date: Fri, 29 Oct 2021 17:01:26 +0100 Subject: [PATCH] KEYCLOAK-19052: Optimised (split) the clearExpiredEvents query to reduce execution time --- .../events/jpa/JpaEventStoreProvider.java | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/model/jpa/src/main/java/org/keycloak/events/jpa/JpaEventStoreProvider.java b/model/jpa/src/main/java/org/keycloak/events/jpa/JpaEventStoreProvider.java index ce3c732c7d1..8a577083d48 100755 --- a/model/jpa/src/main/java/org/keycloak/events/jpa/JpaEventStoreProvider.java +++ b/model/jpa/src/main/java/org/keycloak/events/jpa/JpaEventStoreProvider.java @@ -88,16 +88,17 @@ public class JpaEventStoreProvider implements EventStoreProvider { if (KeycloakModelUtils.isRealmProviderJpa(session)) { // Group realms by expiration times. This will be effective if different realms have same/similar event expiration times, which will probably be the case in most environments - List eventExpirations = em.createQuery("select distinct realm.eventsExpiration from RealmEntity realm").getResultList(); + List eventExpirations = em.createQuery("select distinct realm.eventsExpiration from RealmEntity realm where realm.eventsExpiration > 0").getResultList(); for (Long expiration : eventExpirations) { - if (expiration > 0) { - int currentNumDeleted = em.createQuery("delete from EventEntity where realmId in (select realm.id from RealmEntity realm where realm.eventsExpiration = :expiration) and time < :eventTime") - .setParameter("expiration", expiration) - .setParameter("eventTime", currentTimeMillis - (expiration * 1000)) - .executeUpdate(); - logger.tracef("Deleted %d events for the expiration %d", currentNumDeleted, expiration); - numDeleted += currentNumDeleted; - } + List realmIds = em.createQuery("select realm.id from RealmEntity realm where realm.eventsExpiration = :expiration") + .setParameter("expiration", expiration) + .getResultList(); + int currentNumDeleted = em.createQuery("delete from EventEntity where realmId in :realmIds and time < :eventTime") + .setParameter("realmIds", realmIds) + .setParameter("eventTime", currentTimeMillis - (expiration * 1000)) + .executeUpdate(); + logger.tracef("Deleted %d events for the expiration %d", currentNumDeleted, expiration); + numDeleted += currentNumDeleted; } logger.debugf("Cleared %d expired events in all realms", numDeleted); } else {