[
https://issues.jboss.org/browse/WFLY-6554?page=com.atlassian.jira.plugin....
]
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)