keycloak-memoizeit

Details

diff --git a/model/jpa/src/main/java/org/keycloak/connections/jpa/HibernateStatsReporter.java b/model/jpa/src/main/java/org/keycloak/connections/jpa/HibernateStatsReporter.java
index fbe09ae..349bd40 100644
--- a/model/jpa/src/main/java/org/keycloak/connections/jpa/HibernateStatsReporter.java
+++ b/model/jpa/src/main/java/org/keycloak/connections/jpa/HibernateStatsReporter.java
@@ -21,6 +21,8 @@ import javax.persistence.EntityManagerFactory;
 
 import org.hibernate.SessionFactory;
 import org.hibernate.jpa.internal.EntityManagerFactoryImpl;
+import org.hibernate.stat.CollectionStatistics;
+import org.hibernate.stat.EntityStatistics;
 import org.hibernate.stat.QueryStatistics;
 import org.hibernate.stat.Statistics;
 import org.jboss.logging.Logger;
@@ -32,6 +34,8 @@ import org.keycloak.services.scheduled.ScheduledTask;
  */
 public class HibernateStatsReporter implements ScheduledTask {
 
+    private static final int LIMIT = 100; // Just hardcoded for now
+
     private final EntityManagerFactory emf;
     private static final Logger logger = Logger.getLogger(HibernateStatsReporter.class);
 
@@ -53,21 +57,66 @@ public class HibernateStatsReporter implements ScheduledTask {
 
     protected void logStats(Statistics stats) {
         String lineSep = System.getProperty("line.separator");
-        StringBuilder builder = new StringBuilder(lineSep).append(stats.toString()).append(lineSep);
-        builder.append(lineSep).append("Queries statistics: ").append(lineSep).append(lineSep);
+        StringBuilder builder = new StringBuilder(lineSep).append(stats.toString()).append(lineSep).append(lineSep);
 
-        for (String query : stats.getQueries()) {
-            QueryStatistics queryStats = stats.getQueryStatistics(query);
+        logEntities(builder, lineSep, stats);
+        logCollections(builder, lineSep, stats);
+        logQueries(builder, lineSep, stats);
 
-            builder.append(query).append(lineSep)
-                    .append("executionCount=" + queryStats.getExecutionCount()).append(lineSep)
-                    .append("executionAvgTime=" + queryStats.getExecutionAvgTime()).append(" ms").append(lineSep)
-                    .append(lineSep);
+        logger.infof(builder.toString());
+    }
 
-            builder.append(lineSep);
+
+    protected void logEntities(StringBuilder builder, String lineSep, Statistics stats) {
+        builder.append("Important entities statistics: ").append(lineSep);
+        for (String entity : stats.getEntityNames()) {
+            EntityStatistics entityStats = stats.getEntityStatistics(entity);
+            if (entityStats.getInsertCount() > LIMIT || entityStats.getDeleteCount() > LIMIT || entityStats.getUpdateCount() > LIMIT || entityStats.getLoadCount() > LIMIT || entityStats.getFetchCount() > LIMIT) {
+                builder.append(entity + " - ")
+                        .append("inserted: " + entityStats.getInsertCount())
+                        .append(", updated: " + entityStats.getUpdateCount())
+                        .append(", removed: " + entityStats.getDeleteCount())
+                        .append(", loaded: " + entityStats.getLoadCount())
+                        .append(", fetched: " + entityStats.getFetchCount())
+                        .append(lineSep);
+            }
         }
+        builder.append(lineSep);
+    }
 
-        logger.infof(builder.toString());
+
+    protected void logCollections(StringBuilder builder, String lineSep, Statistics stats) {
+        builder.append("Important collections statistics: ").append(lineSep);
+        for (String col : stats.getCollectionRoleNames()) {
+            CollectionStatistics collectionStats = stats.getCollectionStatistics(col);
+            if (collectionStats.getRecreateCount() > LIMIT || collectionStats.getUpdateCount() > LIMIT || collectionStats.getRemoveCount() > LIMIT ||
+                    collectionStats.getLoadCount() > LIMIT || collectionStats.getFetchCount() > LIMIT) {
+                builder.append(col + " - ")
+                        .append("recreated: " + collectionStats.getRecreateCount())
+                        .append(", updated: " + collectionStats.getUpdateCount())
+                        .append(", removed: " + collectionStats.getRemoveCount())
+                        .append(", loaded: " + collectionStats.getLoadCount())
+                        .append(", fetched: " + collectionStats.getFetchCount())
+                        .append(lineSep);
+            }
+        }
+        builder.append(lineSep);
+    }
+
+
+    protected void logQueries(StringBuilder builder, String lineSep, Statistics stats) {
+        builder.append("Important queries statistics: ").append(lineSep).append(lineSep);
+        for (String query : stats.getQueries()) {
+            QueryStatistics queryStats = stats.getQueryStatistics(query);
+
+            if (queryStats.getExecutionCount() > LIMIT || (queryStats.getExecutionCount() * queryStats.getExecutionAvgTime() > LIMIT)) {
+                builder.append(query).append(lineSep)
+                        .append("executionCount=" + queryStats.getExecutionCount()).append(lineSep)
+                        .append("executionAvgTime=" + queryStats.getExecutionAvgTime()).append(" ms").append(lineSep)
+                        .append(lineSep)
+                        .append(lineSep);
+            }
+        }
     }
 
 }