2011-05-05 3 views
0

저는 Struts 2.2.1.1과 Hibernate 3.6.2.Final을 사용하고 있습니다. Tomcat 7.0.11에서 실행중인 연결 풀에도 C3P0을 사용하고 있습니다.Struts2로 Hiberate - Full Hibernate Plugin이나 다른 방법을 사용하여 Session을 닫으시겠습니까?

내 최대 절전 모드 세션이 닫히지 않고 "hibernate.c3p0.max_size"속성에 구성된 최대 연결 수를 빠르게 초과하는 문제가 있습니다.

내 Hibernate 세션은 열렸지만 닫히지 않았기 때문에 생각합니다. ServletContext에 저장된 SessionFactory에서 Sessions를 열고 있습니다. finally 클래스에서 세션을 닫으려고했으나 org.hibernate.LazyInitializationException 예외가 발생합니다.

나는 약간의 연구를했으며 Full Hibernate Plugin 접근법과 Open Session in View 접근법을 발견했습니다.

나는 이것이 일반적인 문제라고 생각하고 있으며 가장 일반적으로 사용되는 솔루션에 대한 느낌을 얻고 싶습니다.

내가 알아챈 또 다른 사실은 Full Hibernate Plugin이 Struts 2.0.9+에서 2.1.6을 지원하지만 2.2.1.1을 사용하고 있다는 것입니다. 이것이 문제가되거나 웹 사이트가 최신 버전을 나열하도록 업데이트되지 않았는지 확실하지 않습니다.

모든 의견을 보내 주시면 감사하겠습니다.

답변

1

나는 최대 절전 모드 플러그인을 사용한 적이 없지만 열린 세션보기 패턴을 채택하는 것이 좋습니다. 세션을 종료하고 싶습니다.

이 문제를 처리하는 가장 일반적인 방법 중 하나는 요청 시작시 세션을 만들어 로컬 스레드에 저장 한 다음 요청이 끝날 때 닫는 것입니다. 이것은 Struts 인터셉터 또는 서블릿 필터에서 수행 할 수 있습니다. 기본적으로 :

public class HibernateSessionInterceptor extends AbstractInterceptor { 
    @Override 
    public String intercept(final ActionInvocation invocation) throws Exception { 
     try { 
      // create the session and place it in the ThreadLocal 
      return invocation.invoke(); 
     } finally { 
      // close the session and remove it from the ThreadLocal 
     } 
    } 
} 

Google Guice를 사용하는 경우 JPA를 기반으로하는 지속성 플러그인 (guice-persist)이 있습니다. 동일한 접근법을 사용하지만 서블릿 필터를 사용합니다.

+0

스티븐 베니테스 감사합니다. 다시 발견하십시오. – Justin

관련 문제