Das passiert, wenn ich meine Junit-Tests durchführe ...
Another CacheManager with same name 'cacheManager' already exists in the same VM. Please
provide unique names for each CacheManager in the config or do one of following:
1. Use one of the CacheManager.create() static factory methods to reuse same
CacheManager with same name or create one if necessary
2. Shutdown the earlier cacheManager before creating new one with same name.
The source of the existing CacheManager is:
DefaultConfigurationSource [ ehcache.xml or ehcache-failsafe.xml ]
Was ist der Grund für die Ausnahme? Könnte mehr als 1 cacheManager gleichzeitig ausgeführt werden?
So habe ich den cachManager mit Sping 3.1.1 konfiguriert. Der Bereich des cacheManager wird explizit auf "singleton" gesetzt.
<ehcache:annotation-driven />
<bean
id="cacheManager"
class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"
scope="singleton"
/>
Die ehcache.xml sieht aus wie
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
updateCheck="false"
maxBytesLocalHeap="100M"
name="cacheManager"
>
....
</ehcache>
Endlich meine Klasse
@Component
public class BookingCache implements CacheWrapper<String, BookingUIBean> {
@Autowired
private CacheManager ehCacheManager;
....
}
Ich bin mir sehr sicher, dass es sich nur um einen cacheManager in meiner Codebasis handelt. Etwas anderes führt wahrscheinlich die n-te Instanz aus.
Antworten:
Ihre EhCacheManagerFactoryBean ist zwar ein Singleton, erstellt jedoch mehrere CacheManager und versucht, ihnen denselben Namen zu geben. Dies verstößt gegen die Semantik von Ehcache 2.5 .
Weisen Sie die Factory-Bean an, eine gemeinsam genutzte Instanz des CacheManager in der JVM zu erstellen, indem Sie die gemeinsam genutzte Eigenschaft auf true setzen.
<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" p:shared="true"/>
quelle
p:config-location="classpath:ehcache-foo.xml" p:shared="true"
auf meiner EhCacheManagerFactoryBean, und dennoch bekomme ich einen Konflikt, weil zwei WARs auf meiner JVM dasselbe Modul verwenden.Ich hatte das gleiche Problem mit meinen Integrationstests mit JPA (2.0) + Hibernate (3.6.4) + Spring (3.2.4). Das Problem wurde mithilfe der folgenden Konfiguration im Ruhezustand behoben:
<property name="hibernate.cache.region.factory_class" value="net.sf.ehcache.hibernate.SingletonEhCacheRegionFactory"/>
anstatt zu verwenden
<property name="hibernate.cache.region.factory_class" value="net.sf.ehcache.hibernate.EhCacheRegionFactory"/>
quelle
Ihr Problem ist die im Spring-Test-Framework integrierte Optimierung zum Laden von Kontexten. Spring (standardmäßig) zerstört den Kontext nicht, sobald die Testklasse fertig ist, in der Hoffnung, dass eine andere Testklasse sie wiederverwendet (anstatt sie von Grund auf neu zu erstellen).
Sie können diese Standardeinstellung mit @DirtiesContext überschreiben. Wenn Sie maven verwenden, können Sie den todsicheren forkMode auf "immer" setzen und eine neue VM pro Testklasse erstellen.
quelle
Sie können auch versuchen, den Namen "xxx" in Ihrer ehcache.xml-Konfiguration (im ehcache-Element) festzulegen.
Das war der Trick für mich, da ich glaube, dass in einem der Module meiner App eine andere Cache-Konfiguration lauerte.
Die gemeinsame Lösung funktioniert auch, aber ich kenne die weitreichenden Auswirkungen davon nicht.
quelle
Nach dem Upgrade auf Hibernate 5 musste ich Folgendes verwenden:
<property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory"/>
Anstatt von:
<property name="hibernate.cache.region.factory_class" value="net.sf.ehcache.hibernate.SingletonEhCacheRegionFactory"/>
Bitte beachten Sie, dass sich die Pakete voneinander unterscheiden.
quelle
Für die Nachwelt: Ein besserer Weg ist die Verwendung der Eigenschaft "Akzeptieren vorhanden" der EhCacheManagerFactoryBean .
quelle
Wenn Sie nur Ihren Geschäftsdienst und nicht den Cache der zweiten Ebene testen, können Sie die Konfiguration der zweiten Ebene in Ihrer Spring-Konfigurationsdatei entfernen. Der Test wird erfolgreich ausgeführt. Es gibt meine Konfiguration der zweiten Ebene:
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="persistenceUnitName" value="defaultPU" /> <property name="jpaVendorAdapter" ref="hibernateJpaVendorAdapter" /> <property name="jpaProperties"> <props> <prop key="hibernate.dialect">${hibernate.dialect}</prop> <prop key="hibernate.show_sql">false</prop> <!-- <prop key="hibernate.hbm2ddl.auto">update</prop> --> <prop key="hibernate.cache.use_second_level_cache">false</prop> <prop key="hibernate.cache.use_query_cache">false</prop> </props> </property> </bean>
Wenn ich zur vollständigen Konfiguration der Cache-Konfiguration der zweiten Ebene wechsle, wird die reale Webanwendung zur Laufzeit wie folgt verwendet:
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="persistenceUnitName" value="defaultPU" /> <property name="jpaVendorAdapter" ref="hibernateJpaVendorAdapter" /> <property name="jpaProperties"> <props> <prop key="hibernate.dialect">${hibernate.dialect}</prop> <prop key="hibernate.show_sql">false</prop> <!-- <prop key="hibernate.hbm2ddl.auto">update</prop> --> <prop key="hibernate.cache.use_second_level_cache">true</prop> <prop key="hibernate.cache.use_query_cache">true</prop> <prop key="hibernate.cache.region.factory_class">net.sf.ehcache.hibernate.EhCacheRegionFactory</prop> <prop key="net.sf.ehcache.configurationResourceName">ehcache/ehcache-hibernate-local.xml</prop> </props> </property> </bean>
dann bekomme ich die gleiche Ausnahme "Ein anderer unbenannter CacheManager existiert bereits in derselben VM"
quelle
In meinem Fall haben wir einen benutzerdefinierten Cache-Manager, der als Bean definiert ist. Auch ein benutzerdefinierter Anwendungskontext, sodass wir den Spring Junit Runner nicht verwenden ... daher funktioniert der @DirtiesContext nicht.
Der Trick besteht darin, die Cache-Instanz aus der Bean abzurufen und in diesem Cache den cacheManager (die Instanz aus EHCache) abzurufen. Rufen Sie auf diesem Cachemanager die Methode removeCache auf.
Fügen Sie dies in eine mit @After kommentierte Methode ein, und Ihr Cache wird nach jedem Test von der VM entfernt. So was:
@After public void destroy() { MyCustomCacheManager customCacheManager = (MyCustomCacheManager) context.getBean("yourCustomCacheManagerBean"); try { net.sf.ehcache.Cache cache = customCacheManager.getCache(); net.sf.ehcache.CacheManager cacheManager = cache.getCacheManager(); cacheManager.removeCache("nameOfYourCache"); } catch (IllegalAccessException e) { e.printStackTrace(); } context.destroy(); context = null; }
quelle
Ich habe es gelöst, indem ich folgende Ressourcen zu resources.groovy hinzugefügt habe:
Beans = {... aclCacheManager (EhCacheManagerFactoryBean) {shared = true} ...}
quelle
Es ist mir passiert, als ich zu Spring Boot 2.0.2 gewechselt bin . Es wurde wie folgt behoben:
ENTFERNEN in application.yml
spring.jpa.properties.hibernate.cache.region.factory_class: org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory
ENTFERNEN in pom.xml
<dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache</artifactId> </dependency>
HALTEN Sie nur in pom.xml
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-ehcache</artifactId> </dependency>
quelle
Einstellen der
EhCacheManagerFactoryBean#shared
zutrue
für mich gearbeitet.Einstellen der
EhCacheManagerFactoryBean#acceptExisting
auftrue
nicht für mich arbeiten.import org.springframework.cache.ehcache.EhCacheCacheManager; import org.springframework.cache.ehcache.EhCacheManagerFactoryBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.ClassPathResource; @Configuration public class EhCacheConfiguration { @Bean public EhCacheCacheManager ehCacheCacheManager() { return new EhCacheCacheManager(ehCacheManagerFactoryBean().getObject()); } @Bean public EhCacheManagerFactoryBean ehCacheManagerFactoryBean() { EhCacheManagerFactoryBean cacheManagerFactoryBean = new EhCacheManagerFactoryBean(); cacheManagerFactoryBean.setConfigLocation(new ClassPathResource("ehcache.xml")); cacheManagerFactoryBean.setShared(true); return cacheManagerFactoryBean; } }
Wie unter Verwenden von EhCache in Spring 4 ohne XML erläutert
quelle
Für zukünftige Leser war die Ursache für dieses Problem in meinem Fall, dass ich in meiner pom.xml-Datei die mir unbekannte Hibernate-Ehcache-Bibliothek importiert hatte, die auch bereits die EHCache-Bibliothek enthielt, und dann explizit die net.sf.ehache importierte libray.
Dies schien gut zu funktionieren, als ich als eigenständige App ausgeführt wurde (z. B. als Befehlszeilenprogramm), verursachte jedoch den Fehler im ursprünglichen Beitrag, wenn ich auf einem Tomcat-Server ausgeführt wurde.
Ändern meiner POM-Datei von:
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-ehcache</artifactId> <version>5.0.2.Final</version> </dependency> <dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache</artifactId> <version>2.7.4</version> </dependency>
Zu:
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-ehcache</artifactId> <version>5.0.2.Final</version> </dependency> <!-- ehcache dependency removed -->
Das Problem wurde behoben. Wenn jemand eine Idee hat, warum das Problem nur beim Ausführen in einem Tomcat-Container auftrat, würde mich das interessieren.
quelle
In glassfish 3.0.1 habe ich das Problem darauf zurückgeführt, dass IniShiroFilter zweimal initialisiert wurde. Dies geschieht, wenn gleichzeitige Anforderungen unmittelbar nach dem Start des Servers ausgelöst werden. Es folgt eine Stapelverfolgung von zwei verschiedenen Threads, die zwei HTTP-Anforderungen entsprechen:
[#|2012-11-28T08:25:10.630-0800|SEVERE|glassfish3.0.1|javax.enterprise.system.std.com.sun.enterprise.v3.services.impl|_ThreadID=28;_ThreadName=Thread-1;|java.lang.Exception: Stack trace at java.lang.Thread.dumpStack(Thread.java:1249) at org.apache.shiro.web.servlet.IniShiroFilter.<init>(IniShiroFilter.java:124) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) at java.lang.reflect.Constructor.newInstance(Constructor.java:513) at com.sun.enterprise.container.common.impl.util.InjectionManagerImpl.createManagedObject(InjectionManagerImpl.java:303) at com.sun.enterprise.web.WebContainer.createFilterInstance(WebContainer.java:725) at com.sun.enterprise.web.WebModule.createFilterInstance(WebModule.java:1948) at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:248) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:215) at com.sentilla.filter.DumpFilter.doFilter(DumpFilter.java:152) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:215) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:277) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:188) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:641) at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97) at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:85) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:185) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:641) at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:322) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:226) at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:239) at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:791) at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693) at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:954) at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:170) at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:102) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88) at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76) at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53) at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57) at com.sun.grizzly.ContextTask.run(ContextTask.java:69) at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:330) at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:309) at java.lang.Thread.run(Thread.java:662)
Ein weiterer Thread
[#|2012-11-28T08:25:15.299-0800|SEVERE|glassfish3.0.1|javax.enterprise.system.std.com.sun.enterprise.v3.services.impl|_ThreadID=29;_ThreadName=Thread-1;|java.lang.Exception: Stack trace at java.lang.Thread.dumpStack(Thread.java:1249) at org.apache.shiro.web.servlet.IniShiroFilter.<init>(IniShiroFilter.java:124) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) at java.lang.reflect.Constructor.newInstance(Constructor.java:513) at com.sun.enterprise.container.common.impl.util.InjectionManagerImpl.createManagedObject(InjectionManagerImpl.java:303) at com.sun.enterprise.web.WebContainer.createFilterInstance(WebContainer.java:725) at com.sun.enterprise.web.WebModule.createFilterInstance(WebModule.java:1948) at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:248) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:215) at com.sentilla.filter.DumpFilter.doFilter(DumpFilter.java:152) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:215) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:277) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:188) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:641) at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97) at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:85) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:185) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:641) at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:322) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:226) at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:239) at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:791) at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693) at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:954) at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:170) at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:102) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88) at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76) at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53) at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57) at com.sun.grizzly.ContextTask.run(ContextTask.java:69) at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:330) at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:309) at java.lang.Thread.run(Thread.java:662)
Ein Blick auf den Stack-Trace ApplicationFilterConfig.java:248 könnte der Schuldige sein. Oder Glassfish initialisiert Filter im falschen Kontext. Zum Vergleich: Tomcat initialisiert Filter während BootStrap.
quelle
In meinem Fall ist das Problem der Komponentenscan und die Java-Konfiguration.
root-context.xml <context:component-scan base-package="org.beansugar"> servlet-context.xml <context:component-scan base-package="org.beansugar">
Spring Component-Scan funktioniert zweimal mit XML-Dateien. Es generiert zu jeder Laufzeit Beans in SpringConfig.java. Dann wurde ein doppelter Cache-Manager erstellt.
Also habe ich das wie unten geändert.
root-context.xml <context:component-scan base-package="org.beansugar"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan> servlet-context.xml <context:component-scan base-package="org.beansugar" use-default-filters="false"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan>
quelle
Dieser Fehler tritt auch bei falschen Zuordnungsdateien auf. Die Nachricht ist schrecklich, sagt nicht die Ursache.
quelle
In meinem Fall war die Konfiguration wie folgt:
<spring.boot.version>1.5.8.RELEASE</spring.boot.version> <spring.boot.yarn.version>2.4.0.RELEASE</spring.boot.yarn.version> <spring.version>4.3.7.RELEASE</spring.version> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>3.5.1-Final</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-ehcache</artifactId> <version>3.5.1-Final</version> </dependency>
Das Ändern der EHCache-Anbieterklasse hat den Job für mich erledigt. Ich habe die Cache-Provider-Klasse verwendet, da
org.hibernate.cache.EhCacheProvider
ich diese stattdessen geändert habe in:net.sf.ehcache.hibernate.SingletonEhCacheProvider
quelle
Ab Spring Boot 2.1.2 hat die folgende Konfiguration das Problem behoben . (Beachten Sie, dass dies Ausschnitte aus der Gesamtkonfiguration sind.)
Abhängigkeiten:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>5.2.8.Final</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-ehcache</artifactId> <version>5.2.8.Final</version> </dependency>
application.yml config:
spring: jpa: open-in-view: false hibernate: ddl-auto: none show-sql: true properties: dialect: org.hibernate.dialect.MySQLDialect net: sf: ehcache: configurationResourceName: ehcache.xml hibernate: cache: use_second_level_cache: true region: factory_class: org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory
Konfiguration von ehcache.xml:
<?xml version="1.0" encoding="UTF-8"?> <ehcache> <!-- Required elements --> <diskStore path="java.io.tmpdir"/> <defaultCache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true"/> <!-- Cache settings per class --> <cache name="com.mystuff.component.services.example.Book" maxElementsInMemory="1000" eternal="false" timeToIdleSeconds="300" timeToLiveSeconds="600" overflowToDisk="true"/> </ehcache>
Die Anwendung, an der ich arbeite, wird ohne funktionierenden Cache drastisch verlangsamt. Zur Validierung habe ich einfach die Anwendung ausgeführt und einen der leseintensiven Endpunkte erreicht.
quelle