Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id 19E842009F8 for ; Fri, 3 Jun 2016 10:33:54 +0200 (CEST) Received: by cust-asf.ponee.io (Postfix) id 186D3160A2A; Fri, 3 Jun 2016 08:33:54 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id 3465C160A25 for ; Fri, 3 Jun 2016 10:33:53 +0200 (CEST) Received: (qmail 53093 invoked by uid 500); 3 Jun 2016 08:33:52 -0000 Mailing-List: contact commits-help@deltaspike.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@deltaspike.apache.org Delivered-To: mailing list commits@deltaspike.apache.org Received: (qmail 53084 invoked by uid 99); 3 Jun 2016 08:33:52 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 03 Jun 2016 08:33:52 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 49506DFC61; Fri, 3 Jun 2016 08:33:52 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: tandraschko@apache.org To: commits@deltaspike.apache.org Message-Id: X-Mailer: ASF-Git Admin Mailer Subject: deltaspike git commit: DELTASPIKE-1161 [perf] avoid Instance#Select Date: Fri, 3 Jun 2016 08:33:52 +0000 (UTC) archived-at: Fri, 03 Jun 2016 08:33:54 -0000 Repository: deltaspike Updated Branches: refs/heads/master d2adacf41 -> 96761cdbf DELTASPIKE-1161 [perf] avoid Instance#Select Project: http://git-wip-us.apache.org/repos/asf/deltaspike/repo Commit: http://git-wip-us.apache.org/repos/asf/deltaspike/commit/96761cdb Tree: http://git-wip-us.apache.org/repos/asf/deltaspike/tree/96761cdb Diff: http://git-wip-us.apache.org/repos/asf/deltaspike/diff/96761cdb Branch: refs/heads/master Commit: 96761cdbf78f1ed63921aff78a007c8625dbc697 Parents: d2adacf Author: tandraschko Authored: Fri Jun 3 10:33:05 2016 +0200 Committer: tandraschko Committed: Fri Jun 3 10:33:05 2016 +0200 ---------------------------------------------------------------------- .../data/impl/handler/EntityManagerRef.java | 24 +++++++- .../impl/handler/EntityManagerRefLookup.java | 64 ++++++++++++++++++-- 2 files changed, 81 insertions(+), 7 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/deltaspike/blob/96761cdb/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/EntityManagerRef.java ---------------------------------------------------------------------- diff --git a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/EntityManagerRef.java b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/EntityManagerRef.java index 8e6dad9..5039003 100644 --- a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/EntityManagerRef.java +++ b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/EntityManagerRef.java @@ -24,13 +24,20 @@ import org.apache.deltaspike.data.api.EntityManagerResolver; public class EntityManagerRef { - private Class entityManagerResolverClass; - private DependentProvider entityManagerResolverDependentProvider; private EntityManager entityManager; + private DependentProvider entityManagerDependentProvider; + + private Class entityManagerResolverClass; private EntityManagerResolver entityManagerResolver; - + private DependentProvider entityManagerResolverDependentProvider; + public void release() { + if (entityManagerDependentProvider != null) + { + entityManagerDependentProvider.destroy(); + } + if (entityManagerResolverDependentProvider != null) { entityManagerResolverDependentProvider.destroy(); @@ -77,4 +84,15 @@ public class EntityManagerRef { this.entityManagerResolver = entityManagerResolver; } + + public DependentProvider getEntityManagerDependentProvider() + { + return entityManagerDependentProvider; + } + + public void setEntityManagerDependentProvider( + DependentProvider entityManagerDependentProvider) + { + this.entityManagerDependentProvider = entityManagerDependentProvider; + } } http://git-wip-us.apache.org/repos/asf/deltaspike/blob/96761cdb/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/EntityManagerRefLookup.java ---------------------------------------------------------------------- diff --git a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/EntityManagerRefLookup.java b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/EntityManagerRefLookup.java index aa3ea3b..c43b42f 100644 --- a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/EntityManagerRefLookup.java +++ b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/EntityManagerRefLookup.java @@ -18,9 +18,14 @@ */ package org.apache.deltaspike.data.impl.handler; +import java.lang.annotation.Annotation; +import java.util.Set; import javax.enterprise.context.ApplicationScoped; +import javax.enterprise.inject.spi.Bean; +import javax.enterprise.inject.spi.BeanManager; import javax.inject.Inject; import javax.persistence.EntityManager; +import org.apache.deltaspike.core.api.provider.BeanManagerProvider; import org.apache.deltaspike.core.api.provider.BeanProvider; import org.apache.deltaspike.data.impl.meta.RepositoryComponent; @@ -30,11 +35,51 @@ import org.apache.deltaspike.jpa.spi.entitymanager.ActiveEntityManagerHolder; public class EntityManagerRefLookup { @Inject - private EntityManager entityManager; - - @Inject private ActiveEntityManagerHolder activeEntityManagerHolder; + private volatile Boolean globalEntityManagerInitialized; + private boolean globalEntityManagerIsNormalScope; + private EntityManager globalEntityManager; + + private void lazyInitGlobalEntityManager() + { + if (this.globalEntityManagerInitialized == null) + { + initGlobalEntityManager(); + } + } + + private synchronized void initGlobalEntityManager() + { + // switch into paranoia mode + if (this.globalEntityManagerInitialized == null) + { + this.globalEntityManagerInitialized = true; + + BeanManager beanManager = BeanManagerProvider.getInstance().getBeanManager(); + Set> beans = beanManager.getBeans(EntityManager.class); + + if (!beans.isEmpty() && beans.size() == 1) + { + Class scope = beanManager.resolve(beans).getScope(); + globalEntityManagerIsNormalScope = beanManager.isNormalScope(scope); + + if (globalEntityManagerIsNormalScope) + { + Bean bean = beans.iterator().next(); + globalEntityManager = (EntityManager) beanManager.getReference(bean, + EntityManager.class, + beanManager.createCreationalContext(bean)); + } + } + else + { + throw new IllegalArgumentException( + "None or multiple EntityManager's found with the default qualifier."); + } + } + } + public EntityManagerRef lookupReference(final RepositoryComponent repository) { EntityManagerRef ref = new EntityManagerRef(); @@ -73,7 +118,18 @@ public class EntityManagerRefLookup } else { - ref.setEntityManager(entityManager); + lazyInitGlobalEntityManager(); + if (globalEntityManagerIsNormalScope) + { + ref.setEntityManager(globalEntityManager); + } + else + { + ref.setEntityManagerDependentProvider( + BeanProvider.getDependent(EntityManager.class)); + ref.setEntityManager( + ref.getEntityManagerDependentProvider().get()); + } } }