2011-05-03 6 views
0

나는 Spring에 다음과 같은 문제가있다 : 나는 싱글 톤이 한 번 생성 된 다음 Spring 캐시에서 참조 될 것으로 예상했다. 하지만 그럴 것 같지 않습니다.Spring이 새로운 객체를 생성하지만하지 말아야한다

<bean id="Cache" class="java.util.HashMap" scope="singleton" > 
</bean> 

같은 아래 참조 :

<bean id="ManuallyCachingDAO" class="blah" 
scope="singleton" init-method="init" destroy-method="destroy"> 
    <property name="cache" ref="Cache"></property> 
    ... 

과 ManuallyCachingDAO의 코드

:

public Object get(int id) { 
    Object o = cache.get(id); 
    if (o != null) { 
     return o; 
    } 
    // ... code for retrieving the object from the DB 
} 

하지만 HashMap 비운됩니다 내 beans.xml 환경에서 다음과 같은 라인을 가지고 때때로 신비한 방법으로! 즉, 나는 그것이 실제로 비어 있다고 생각하지 않는다. 나는 단지 다른 클래스의 ManuallyCachingDAO을 참조하면 그냥 삭제되고 다시 작성된 것 같습니다.

이 문제를 해결하는 방법을 알려주시겠습니까?

편집 : 로빈의 힌트에 : 나는 (모두는 아니지만) 많은 클래스에서 콩을 얻으려면 다음을 수행하십시오

ClassPathResource blah = etc.; 
XmlBeanFactory xbf = new XmlBeanFactory(blah); 
... 
xbf.getBean("Cache"); 

... 지금 내가도에 대한 (그것을하고 있어요 다른 콩을 많이) ... 그것은 매우 어리 석거나 아주 나쁜 생각입니까 아니면 둘 다입니까? 나는 지금 내가 잘못하고있는 일이 나에게 일어난다 고 생각한다. 지금까지, 나는 모든 XmlBeanFactory가 어쨌든 매우 바보 일 수도 있고 또는 옳은 것을 말해 줄 수있는 동일한 리소스를 잡는다고 의심했다.

+0

init() 메서드를 표시하십시오 –

+1

당신이 생각하는 것이 실제로 발생하고 있음을 입증해야합니다. 디버거 또는 System.out을 사용하여 "싱글 톤"에 대한 참조가 실제로 변경되는지 확인하십시오. 확실히 알지 못하면 쉽게 결정할 수 있습니다. 야생 거위 추격을 할 수도 있습니다. – rfeak

+0

맵의 해시 코드가 동일한 인스턴스인지 확인하십시오. 구성에 문제가없는 것으로 보입니다. – Eric

답변

1

config는 괜찮아 보이고, Spring은이 점에서 잘 테스트되었으므로 거기에 놀라움이 없을 것이라고 생각합니다.

콩에 액세스하려고 할 때마다 스프링 컨텍스트를 만들 수 있습니까? 따라서 반복적으로 모든 것을 재생성합니다.

+0

당신은 각 클래스에서 다음을 수행해서는 안된다는 것을 의미합니다. "ClassPathResource blah = etc .; XmlBeanFactory xbf = new XmlBeanFactory (blah); xbf.getBean ("Cache ");" ... 지금 당장하고 있어요 ... 바보 같거나 나쁜 생각입니까? – Hinton

2

나는 스프링이 새로운 HashMaps를 생성하고 있는지 의심 스럽다. 구성이 정상적으로 보입니다. 나는 당신의 논리에 뭔가 잘못되었다고 확신합니다. 부분에서

당신이 실제로지도로 검색 한 값을 기록 할

// ... code for retrieving the object from the DB 

을 표시?

2

동시성이지도를 망칠 수 있습니다. HashMap은 스레드로부터 안전하지 않으므로 싱글 톤으로 사용하고 싶지는 않습니다. 대신 ConcurrentHashMap을 사용해보세요.

+0

ConcurrentHashMap +1, OP 문제의 원인이 아니라고 확신하지만 –

+0

문제는 아니지만 힌트를 주셔서 감사합니다. – Hinton

관련 문제