ehcache 2.1.0 라이브러리가있는 Websphere 7.x의 생산적인 환경에서 문제점이 있습니다. 웹 컨테이너의 스레드는 모두 캐시에서 상담 또는 삽입을 기다리고 있습니다. 프로그래밍 특별한 무관동시 환경의 Ehcache ReentrantReadWriteLock
이NULL
3XMTHREADINFO "WebContainer : 11" J9VMThread:0x00000000C7C10300, j9thread_t:0x0000010043913FB0, java/lang/Thread:0x00000000507623F0, state:P, prio=5
sun.misc.Unsafe.park(Native Method)
java.util.concurrent.locks.LockSupport.park(LockSupport.java:182)
java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:822) <2>
java.util.concurrent.locks.ReentrantReadWriteLock$WriteLock.lock(ReentrantReadWriteLock.java:907)
net.sf.ehcache.store.compound.Segment.put(Segment.java:402)
net.sf.ehcache.store.compound.CompoundStore.put(CompoundStore.java:132)
net.sf.ehcache.Cache.putInternal(Cache.java:1247) <2>
org.springframework.cache.ehcache.EhCacheCache.put(EhCacheCache.java:70)
xxx.yyy.fac.security.userdetails.GaiaLdapAuthoritiesPopulator.putElementCache(GaiaLdapAuthoritiesPopulator.java:466) <4>
xxx.yyy.dgtp.gaiafrontend.core.filters.preauth.GaiaGrantedAuthoritiesWebAuthenticationDetails.buildDetails(GaiaGrantedAuthoritiesWebAuthenticationDetails.java:32) <1>
org.springframework.security.web.authentication.preauth.AbstractPreAuthenticatedProcessingFilter.doAuthenticate(AbstractPreAuthenticatedProcessingFilter.java:114) <1>
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:184) <1>
org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346) <1>
com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:190)
com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:125)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:322)
xxx.yyy.dgtp.gaiafrontend.core.web.filters.JsonDeserializerFilter.doFilterChain(JsonDeserializerFilter.java:109) <1>
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
xxx.yyy.dgtp.gaiafrontend.core.filters.userinfo.UserInfoFilter.followWithTheRequestChain(UserInfoFilter.java:106) <1>
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
xxx.yyy.dgtp.gaia.commons.web.filters.RequestResponseWrapperFilter.doFilter(RequestResponseWrapperFilter.java:69)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:83)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
xxx.yyy.dgtp.gaiafrontend.core.web.filters.ResponseHeadersFilter.doFilter(ResponseHeadersFilter.java:55)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:184) <1>
org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346) <1>
com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:190)
com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:125)
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:190)
com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:125) <1>
com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:908)
com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:939) <1>
com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest(ServletWrapperImpl.java:181)
com.ibm.ws.webcontainer.webapp.WebApp.handleRequest(WebApp.java:3994)
com.ibm.ws.webcontainer.webapp.WebGroup.handleRequest(WebGroup.java:276)
com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:945)
com.ibm.ws.webcontainer.WSWebContainer.handleRequest(WSWebContainer.java:1592)
com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:191)
com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:453) <3>
com.ibm.ws.tcp.channel.impl.NewConnectionInitialReadCallback.sendToDiscriminators(NewConnectionInitialReadCallback.java:214) <1>
com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:175)
com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:217)
com.ibm.io.async.AsyncChannelFuture$1.run(AsyncChannelFuture.java:205)
com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1660)
내가 캐시에 넣어으로 Ehcache에 추상화 계층 및 얻을 수있는 코드 /로 스프링을 사용
이
모든 웹 컨테이너 스레드가 대기하고있는 순간에 덤프입니다.다음과 같이 캐시의 구성은 다음과 같습니다
@Bean
public EhCacheManagerFactoryBean cacheFactoryBean() {
EhCacheManagerFactoryBean ehCacheManagerFactoryBean = new EhCacheManagerFactoryBean();
ehCacheManagerFactoryBean.setConfigLocation(new ClassPathResource("gaia-cache-ldap.xml"));
return ehCacheManagerFactoryBean;
}
@Bean
public CacheManager cacheManagerLdap() {
CacheManager cacheManager = new EhCacheCacheManager(cacheFactoryBean().getObject());
return cacheManager;
}
캐시에 액세스 할 수있는 코드 :
private void getMemberOfRecursive(String group, ConcurrentMap<String, String> groupsCollector) {
if (group != null) {
if (existInCache(group)) {
log.debug("Group: {} exist in cache. No query executing", group);
groupsCollector.put(group, group);
Set<String> groups = (Set<String>) getElementCache(group).get();
for (String newGroup : groups) {
getMemberOfRecursive(newGroup, groupsCollector);
}
} else {
String cn = getCnFromDn(group);
String filter = MessageFormat.format(getFilterGroupRecursive(), cn);
String baseDN = group.substring(group.indexOf(",") + 1);
groupsCollector.put(group, group);
log.debug("Executing recursive query with baseDN: {} " +
" and filter {}: ", baseDN, filter);
Set<String> groups =
getLdapTemplate().searchForSingleAttributeValues(
baseDN, filter, new String[]{}, getRetrievesAttributes());
putElementCache(group, groups);
for (String newGroup : groups) {
getMemberOfRecursive(newGroup, groupsCollector);
}
}
}
으로 Ehcache 설정 파일 : 마지막으로
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ehcache.xsd" updateCheck="false" monitoring="autodetect" dynamicConfig="true">
<diskStore path="java.io.tmpdir" />
<defaultCache maxElementsInMemory="3000" eternal="false" timeToIdleSeconds="1200"
timeToLiveSeconds="1200" overflowToDisk="true" maxElementsOnDisk="10000"
diskPersistent="false" diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU"/>
<cache name="groupsldap" maxElementsInMemory="3000" eternal="true" overflowToDisk="false"
memoryStoreEvictionPolicy="LRU"/>
</ehcache>
Ehcache 구성을 추가 할 수 있습니까? 가능하면 최신 버전으로 업그레이드하십시오. 2.1.0은 꽤 오래된 것입니다. –
우리가 가지고있을 가능성은 있지만 버전의 상승을 평가해야 할 것입니다. 목표는 업데이트를 수행하기 전에 해당 버전의 수정 사항인지 여부를 실제로 확인하는 것입니다. –
적어도 하나의 스레드가 잠금 장치를 잡고 있어야합니다. 또는 두 개의 다른 잠금 (두 개의 다른 스택 추적)이 있으며 교착 상태가 발생할 수 있습니다. 모든 스레드가 동일한 잠금 장치에서 차단되도록하는 것은 불가능합니다 (스레드 덤프가 거짓말을하게 될 수도 있습니다 ... 신뢰할 수 없습니다). – Henri