2011-09-02 2 views
2

현재 Spring.Net과 함께 NHibernate를 사용하고 있고 Spring의 Open Session in View 모듈을 사용하고 있습니다. 내가 말할 수있는 한,이 모듈은 BeginRequest에서 세션을 열고 EndRequest에서 세션을 닫습니다. 실제로 EndRequest에서 세션을 커밋하거나 플러시하지 않습니다.NHibernate/Spring.Net/Asp.Net WebForms - 요청 당 트랜잭션 열기

Spring의 [Transaction] 속성을 사용하여 메소드의 마지막에 커밋을 수행 할 개별 서비스 메소드를 꾸밀 수 있지만이 기술을 사용하고 싶지는 않습니다.

EndRequest에서 세션을 플러시하도록 Spring의 OSIV 모듈을 설정할 수있는 방법이 있습니까? 그렇지 않다면 이것을 달성 할 수있는 내 자신의 열린 세션을 구현할 수있는 쉬운 방법이 있습니까?

나는 NH 3 요리 책에서 예를 들어 "웹의 요청에 따라 세션"을 구현하기 위해 노력했다, 그러나의 CurrentSessionContext에 오류가 발생합니다 :

protected void Application_BeginRequest(object sender, EventArgs e) 
    { 
     var sessionFactory = (ISessionFactory) ContextRegistry.GetContext().GetObject("MySessionFactory"); 
     var session = sessionFactory.OpenSession(); 
     CurrentSessionContext.Bind(session); 
    } 

    protected void Application_EndRequest(object sender, EventArgs e) 
    { 
     var sessionFactory = (ISessionFactory)ContextRegistry.GetContext().GetObject("MySessionFactory"); 
     var session = CurrentSessionContext.Unbind(sessionFactory); 
     session.Dispose(); 
    } 

참고 : 위의 코드는 어떤 봄을 복제하려고 시도합니다. Net이 현재하고 있습니다. 내가 작업을 마친 후 세션을 플러시하기 위해이 업데이트를 계획하고있었습니다.

저는 NH.Net과 그 SessionFactory를 설치하기 위해 Spring.Net을 사용하고 있기 때문에 위의 코드가 작동하지 않는다고 가정합니다. 책의 내용이 잘못 될 수 있습니다.

도움/조언을 크게 주시면 감사하겠습니다.

내가 NHibernate에 3.2 스프링을 사용하고 1.3.2

편집 :

http://forum.springsource.org/archive/index.php/t-16949.html을 읽은 후 나는 요청에 따라 트랜잭션 좋은 생각 궁금해하기 시작하고있다.

+1

플러시 모드가 FlushMode.NEVER로 설정하는 이유 몇 가지 강력한 이유가 있습니다 : http://forum.springframework.net/ 당신은 당신의 web.configappSettings 키/값 쌍을 설정하여 플러시 모드를 설정할 수 있습니다 showthread.php?3303-OpenSessionInViewModule _ FlushMode.NEVER를 OSIV에서 사용하도록 설계된 것입니다. OSIV가 "EndRequest"중에 보류중인 변경 사항을 플러시하고 오류가 발생하면 모든 응답이 이미 클라이언트에 전송 되었기 때문입니다. 고객에게 오류에 관해 알릴 방법이 없습니다. 따라서 기본 FlushMode를 변경할 수는 있지만 권장하지는 않습니다 ._ – Andreas

+0

@ Andreas 이제 원래 생각에서 물러났습니다. 원래 생각한 뒤에있는 주된 이유는 코드 숨김에 많은 비즈니스 로직이있는 기존 웹 앱이 있기 때문입니다. EndRequest에 커밋하도록 OSIV를 업데이트하는 것이 더 간단 할 것이라고 생각했습니다. 코드를 트랜잭션 속성이있는 서비스 메소드로 리팩토링하지 않아도됩니다. 하지만 이걸 총에 맞춰야 할 것처럼 보입니다. 제가 제안한 것에 반대하여이 조언을 듣고 싶다면 기꺼이 받아 들일 것입니다. 감사. – Rezler

답변

2

플러시 모드가 FlushMode.NEVER로 설정하는 이유 몇 가지 강력한 이유가있다 : http://forum.springframework.net/showthread.php?3303-OpenSessionInViewModule

에리히 Eichinger (스프링 소스 GmbH의) OSIV에 FlushMode.NEVER를 갖는

으로 설계된 동작입니다. 이는 "EndRequest"중에 OSIV 이 보류중인 변경 사항을 플러시하고 오류가 발생하면 모든 응답이 이미 클라이언트에 전송 되었기 때문입니다. 에서 클라이언트에게 오류를 알리는 방법은 없습니다. 따라서 기본 FlushMode를 변경할 수는 있지만 권장하지 않습니다.

즉, 문서화되지 않은 기능이 있습니다.

<configuration> 
    <appSettings> 
    ... 
    <add 
     key="Spring.Data.NHibernate.Support.OpenSessionInViewModule.DefaultFlushMode" 
     value="Auto" 
     /> 
    </appSettings> 
    ... 
</configuration> 
-1

저는 Spring.NET에 익숙하지 않지만, 세션 팩토리는 전체 응용 프로그램 용으로 하나만 있어야합니다. 세부 사항 here. 각 요청이 시작될 때마다 세션이 열립니다. 나는이 NH3 변경, 그러나 우리의 NH 2 응용 프로그램에서 우리가 세션 공장이 방법을 구축 여부를 알 수없는

:

NHibernateConfiguration.BuildSessionFactory() 
+1

이것은 내가 묻는 것을 실제로 다루지 않습니다. Spring.Net은 Application Start에서 SessionFactory를 구현 중입니다. – Rezler

관련 문제