You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by rm...@apache.org on 2020/09/30 10:14:46 UTC

[openjpa] branch master updated: [OPENJPA-2834] cache EMF#properties

This is an automated email from the ASF dual-hosted git repository.

rmannibucau pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/openjpa.git


The following commit(s) were added to refs/heads/master by this push:
     new bd015d0  [OPENJPA-2834] cache EMF#properties
bd015d0 is described below

commit bd015d02e95bd3d7c39f3b0a9bdf2cb448bedc75
Author: Romain Manni-Bucau <rm...@gmail.com>
AuthorDate: Wed Sep 30 12:14:35 2020 +0200

    [OPENJPA-2834] cache EMF#properties
---
 .../persistence/EntityManagerFactoryImpl.java      | 27 ++++++++++++++++++----
 .../openjpa/persistence/EntityManagerImpl.java     |  8 +++++++
 2 files changed, 31 insertions(+), 4 deletions(-)

diff --git a/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/EntityManagerFactoryImpl.java b/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/EntityManagerFactoryImpl.java
index 4dd9728..0c8ff9a 100644
--- a/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/EntityManagerFactoryImpl.java
+++ b/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/EntityManagerFactoryImpl.java
@@ -75,6 +75,8 @@ public class EntityManagerFactoryImpl
     private transient StoreCache _cache = null;
     private transient QueryResultCache _queryCache = null;
     private transient MetamodelImpl _metaModel;
+    private transient Map<String, Object> properties;
+    private transient Map<String, Object> emEmptyPropsProperties;
 
     /**
      * Default constructor provided for auto-instantiation.
@@ -111,10 +113,19 @@ public class EntityManagerFactoryImpl
 
     @Override
     public Map<String,Object> getProperties() {
-        Map<String,Object> props = _factory.getProperties();
-        // convert to user readable values
-        props.putAll(createEntityManager().getProperties());
-        return props;
+        if (properties == null) {
+            Map<String,Object> props = _factory.getProperties();
+            // convert to user readable values
+            if (emEmptyPropsProperties != null) {
+                props.putAll(emEmptyPropsProperties);
+            } else {
+                props.putAll(createEntityManager().getProperties());
+            }
+            // no need to sync or volatile, worse case concurrent threads create 2 instances
+            // we just want to avoid to do it after some "init" phase
+            this.properties = props;
+        }
+        return properties;
     }
 
     @Override
@@ -201,6 +212,7 @@ public class EntityManagerFactoryImpl
             props = new HashMap(props);
         }
 
+        boolean canCacheGetProperties = props.isEmpty(); // nominal case
 
         OpenJPAConfiguration conf = getConfiguration();
         Log log = conf.getLog(OpenJPAConfiguration.LOG_RUNTIME);
@@ -273,6 +285,13 @@ public class EntityManagerFactoryImpl
         for (Map.Entry entry : entrySet) {
             em.setProperty(entry.getKey().toString(), entry.getValue());
         }
+        if (canCacheGetProperties) {
+            if (emEmptyPropsProperties == null) {
+                emEmptyPropsProperties = em.getProperties();
+            } else if (EntityManagerImpl.class.isInstance(em)) {
+                EntityManagerImpl.class.cast(em).setProperties(emEmptyPropsProperties);
+            }
+        }
         if (log != null && log.isTraceEnabled()) {
             log.trace(this + " created EntityManager " + em + ".");
         }
diff --git a/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/EntityManagerImpl.java b/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/EntityManagerImpl.java
index 35606f0..9782412 100644
--- a/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/EntityManagerImpl.java
+++ b/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/EntityManagerImpl.java
@@ -122,6 +122,7 @@ public class EntityManagerImpl
     protected RuntimeExceptionTranslator _ret = PersistenceExceptions.getRollbackTranslator(this);
     private boolean _convertPositionalParams = false;
     private boolean _isJoinedToTransaction;
+    private Map<String, Object> properties;
 
     public EntityManagerImpl() {
         // for Externalizable
@@ -1792,6 +1793,10 @@ public class EntityManagerImpl
         }
     }
 
+    public void setProperties(final Map<String, Object> emEmptyPropsProperties) {
+        this.properties = emEmptyPropsProperties;
+    }
+
     private static class BrokerBytesInputStream extends ObjectInputStream {
 
         private OpenJPAConfiguration conf;
@@ -1935,6 +1940,9 @@ public class EntityManagerImpl
      */
     @Override
     public Map<String, Object> getProperties() {
+        if (properties != null) {
+            return properties;
+        }
         Map<String,Object> props = _broker.getProperties();
         for (String s : _broker.getSupportedProperties()) {
             String kernelKey = getBeanPropertyName(s);