[jboss-jira] [JBoss JIRA] (WFLY-6554) Cache configuration are not eagerly defined in Cache Container

Mathieu Lachance (JIRA) issues at jboss.org
Fri Apr 29 09:52:00 EDT 2016


    [ https://issues.jboss.org/browse/WFLY-6554?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13199116#comment-13199116 ] 

Mathieu Lachance commented on WFLY-6554:
----------------------------------------

I think I should have used the SharedInfinispanRegionFactory which seems more suited to JPA. That said, the implementation is very similar and I end up with the same NPE.

Since our application is Spring based, to wire the EntityManager we exports many of the Wildfly provided libraries within the jboss-deployment-structure.xml (partial listing):
{code}
            <module name="org.hibernate" services="import" slot="main"/>
            <module name="org.hibernate.infinispan" services="import" slot="main"/>
            <module name="org.hibernate.jipijapa-hibernate5" services="import" slot="main"/>
            <module name="org.infinispan.commons" services="import" slot="main"/>
            <module name="org.infinispan" services="import" slot="main"/>
            <module name="org.javassist" services="import" slot="main"/>
            <module name="org.jboss.as.clustering.infinispan" services="import" slot="main"/>
            <module name="org.jboss.logging" services="import" slot="main"/>
            <module name="org.jgroups" services="import" slot="main"/>
{code}

In our persistence.xml we use the following vendor properties for the second level cache integration:
{code}
hibernate.cache.use_query_cache=true
hibernate.cache.use_second_level_cache=true
hibernate.cache.region_prefix=the_name_of_our_war
hibernate.cache.region.factory_class=org.jboss.as.jpa.hibernate5.infinispan.SharedInfinispanRegionFactory
{code}

In the standalone.xml we have kept the almost same default configuration (basically we just enabled statistics):
{code}
            <cache-container name="hibernate" default-cache="local-query" module="org.hibernate" statistics-enabled="true">
                <transport lock-timeout="60000"/>
                <local-cache name="local-query" statistics-enabled="true">
                    <eviction strategy="LIRS" max-entries="10000"/>
                    <expiration max-idle="100000"/>
                </local-cache>
                <invalidation-cache name="entity" statistics-enabled="true" mode="SYNC">
                    <transaction mode="NON_XA"/>
                    <eviction strategy="LIRS" max-entries="10000"/>
                    <expiration max-idle="100000"/>
                </invalidation-cache>
                <replicated-cache name="timestamps" statistics-enabled="true" mode="ASYNC"/>
            </cache-container>
{code}

After that, when trying to bootstrap the EntityManager through Spring, this will result in the following stack trace:
{code}
Caused by: org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.spi.CacheImplementor]
	at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:244)
	at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:208)
	at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:189)
	at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:242)
	at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:444)
	at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:879)
	... 64 more
Caused by: org.hibernate.cache.CacheException: java.lang.NullPointerException
	at org.jboss.as.jpa.hibernate5.infinispan.SharedInfinispanRegionFactory.createCacheManager(SharedInfinispanRegionFactory.java:60)
	at org.hibernate.cache.infinispan.InfinispanRegionFactory.start(InfinispanRegionFactory.java:380)
	at org.hibernate.internal.CacheImpl.<init>(CacheImpl.java:49)
	at org.hibernate.engine.spi.CacheInitiator.initiateService(CacheInitiator.java:28)
	at org.hibernate.engine.spi.CacheInitiator.initiateService(CacheInitiator.java:20)
	at org.hibernate.service.internal.SessionFactoryServiceRegistryImpl.initiateService(SessionFactoryServiceRegistryImpl.java:46)
	at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:234)
	... 69 more
Caused by: java.lang.NullPointerException
	at org.jboss.as.jpa.hibernate5.infinispan.SharedInfinispanRegionFactory.createCacheManager(SharedInfinispanRegionFactory.java:58)
	... 75 more
{code}

Let me know if I can provide you any other informations, thanks!


> Cache configuration are not eagerly defined in Cache Container
> --------------------------------------------------------------
>
>                 Key: WFLY-6554
>                 URL: https://issues.jboss.org/browse/WFLY-6554
>             Project: WildFly
>          Issue Type: Bug
>          Components: Clustering
>    Affects Versions: 10.0.0.Final, 10.1.0.Final
>            Reporter: Mathieu Lachance
>            Assignee: Paul Ferraro
>
> In WF8 we used the cache configuration start="EAGER" to force the initialization of the cache configuration.
> In my scenario, we especially used that trick to define all cache configuration (i.e. entity / timestamps / local-query) in the hibernate cache container before any of our war was deployed. Doing so, when wiring the EntityManager programatically (in our application), we were able to depend on the JNDIRegionFactory without getting any NullPointerException/etc.
> This trick has only one bad side effect, which was the creation of unecessary caches.
> Now in WF10, the eager feature is gone and it seems that even if the cache container is available at startup (as discussed in: https://developer.jboss.org/thread/259151) the defined caches are not.
> I do not know if this is a bug or this is by design but this seems wrong to me.
> If we define caches within standalone.xml, I would definitly like to have them defined at the container level. I think it's fair to assume that when pulling the CacheManager all defined caches should have been there.
> I would suggest that when reading all the infinispan subsystem, each cache contained in each cache container be eagerly defined to avoid any issue (and I really meant "defined" and not "started").
> Doing so this would resolve our EntityManager second level cache bootstraping without relying on our application to define the missing cache configuration.



--
This message was sent by Atlassian JIRA
(v6.4.11#64026)


More information about the jboss-jira mailing list