diff --git a/src/main/java/org/olat/core/commons/persistence/DBVendorHibernatePropertiesSimplification.java b/src/main/java/org/olat/core/commons/persistence/DBVendorHibernatePropertiesSimplification.java index 59819d495b30ce213ee415d4a53ae3386eeb9e44..e9af23a45e3f41ebdcf67d5bf10d0f099caee371 100644 --- a/src/main/java/org/olat/core/commons/persistence/DBVendorHibernatePropertiesSimplification.java +++ b/src/main/java/org/olat/core/commons/persistence/DBVendorHibernatePropertiesSimplification.java @@ -24,6 +24,11 @@ */ package org.olat.core.commons.persistence; +import static org.hibernate.cfg.AvailableSettings.QUERY_PLAN_CACHE_MAX_SIZE; +import static org.hibernate.cfg.AvailableSettings.QUERY_PLAN_CACHE_PARAMETER_METADATA_MAX_SIZE; + +import java.util.ArrayList; +import java.util.List; import java.util.Map; import java.util.Properties; @@ -38,26 +43,15 @@ import java.util.Properties; */ public class DBVendorHibernatePropertiesSimplification extends Properties { - - - /** - * - */ - private static final long serialVersionUID = 1L; - - /** - * - */ - public DBVendorHibernatePropertiesSimplification() { - super(); - } + private static final long serialVersionUID = 2191563335029326588L; /** - * First added key valu pairs, which are eventually overwritten by values added during a {@link #setMoreProperties(Map)} call. + * First added key value pairs, which are eventually overwritten by values added during a {@link #setMoreProperties(Map)} call. * @param firstKeyValues */ public DBVendorHibernatePropertiesSimplification(Properties firstKeyValues) { super(); + optimizeForEnvironment(firstKeyValues); putAll(firstKeyValues); } @@ -65,8 +59,50 @@ public class DBVendorHibernatePropertiesSimplification extends Properties { * add more key value pairs * @param more */ - public void setAddMoreProperties(Map<String,String> more){ + public void setAddMoreProperties(Properties more) { + optimizeForEnvironment(more); putAll(more); } + + private void optimizeForEnvironment(Properties more) { + List<Object> keys = new ArrayList<>(more.keySet()); + for(Object key:keys) { + optimizeForEnvironment(key, more); + } + } + + private void optimizeForEnvironment(Object key, Properties properties) { + if(QUERY_PLAN_CACHE_MAX_SIZE.equals(key)) { + MemorySize mem = getMaxMemoryAvailable(); + if(mem == MemorySize.small) { + properties.put(QUERY_PLAN_CACHE_MAX_SIZE, "512"); + } else if(mem == MemorySize.medium) { + properties.put(QUERY_PLAN_CACHE_MAX_SIZE, "1024"); + } + } else if(QUERY_PLAN_CACHE_PARAMETER_METADATA_MAX_SIZE.equals(key)) { + MemorySize mem = getMaxMemoryAvailable(); + if(mem == MemorySize.small) { + properties.put(QUERY_PLAN_CACHE_PARAMETER_METADATA_MAX_SIZE, "32"); + } else if(mem == MemorySize.medium) { + properties.put(QUERY_PLAN_CACHE_PARAMETER_METADATA_MAX_SIZE, "64"); + } + } + } + + private MemorySize getMaxMemoryAvailable() { + long maxMem = Runtime.getRuntime().maxMemory(); + if(maxMem < 550000000l) { + return MemorySize.small; + } else if(maxMem < 1048000000l) { + return MemorySize.medium; + } + return MemorySize.large; + } + + private enum MemorySize { + small, + medium, + large + } } diff --git a/src/main/java/org/olat/core/commons/persistence/_spring/databaseCorecontext.xml b/src/main/java/org/olat/core/commons/persistence/_spring/databaseCorecontext.xml index b7bd150d1523a532bbb8fd0a1118ce13f3e7e276..0e80934ea5617abc1b5a0307786467868add825f 100644 --- a/src/main/java/org/olat/core/commons/persistence/_spring/databaseCorecontext.xml +++ b/src/main/java/org/olat/core/commons/persistence/_spring/databaseCorecontext.xml @@ -147,6 +147,9 @@ olat works only with level 2; the database must support level 2 --> <prop key="hibernate.connection.isolation">2</prop> + <!-- The 2 options below are automatically reduced if not enough memory is available --> + <prop key="hibernate.query.plan_cache_max_size">2048</prop> + <prop key="hibernate.query.plan_parameter_metadata_max_size">128</prop> <prop key="javax.persistence.lock.timeout">30000</prop> </props> </constructor-arg>