현재 데이터베이스를 사용할 수없는 경우 대신 MSMQ를 사용하는 경우가 있습니다. 예 : 응용 프로그램 (wcf 웹 서비스 중 하나)이 시작되고 데이터베이스를 사용할 수없는 경우 들어오는 모든 요청을 MSMQ에 기록해야합니다. 데이터베이스를 다시 사용할 수있게되면 요청을 다시 db에 기록해야합니다. NHibernate를 사용하고 있고 세션 팩토리가 싱글 톤으로 싸여있다. 이 서비스는 다음과 같습니다.Nhibernate 세션 팩토리를 작성하는 데 실패하면 어떻게됩니까?
try
{
// to database (just an example)
SessionProvider.Current.CurrentSession.Save...
}
catch(NHibernate.ADOException)
{
// to msmq
}
이 설정은 서비스가 작동되고 세션 팩토리가 빌드되었을 때 작동합니다. SQL 서버를 중지 할 때 ADO 예외가 발생하고 MSMQ에 문제가 올바르게 기록됩니다.
이제 내 문제. 서비스를 처음 시작하기 전에 데이터베이스를 사용할 수없는 경우 세션 팩터 리를 빌드 할 수 없으며 TypeInitializationException이 발생합니다. 내 싱글 톤 세션 공급자가 고장났습니다. 그래서 데이터베이스가 다시 돌아 오면, 나는 어떻게 든 세션 팩토리를 재 구축 할 방법이 필요하다. 그 타이머를 기반으로할까요? 5 분마다 재건하려고하는 것처럼? 싱글 톤을 어떻게 reinstantiate 수 있습니까?
public sealed class SessionProvider : ISessionProvider
{
private ISessionFactory sessionFactory;
private SessionProvider()
{
sessionFactory = new Configuration().Configure().BuildSessionFactory();
}
public static ISessionFactory SessionFactory
{
get
{
return Nested.SessionProvider.sessionFactory;
}
}
public static ISessionProvider Current
{
get
{
// TypeInitializationException is thrown when building session factory fails
return Nested.SessionProvider;
}
}
private class Nested
{
internal static readonly SessionProvider SessionProvider = new SessionProvider();
}
}
1. 전체에 오류를 게시 할 수 (아마 여기
내가 사용하고있는 세션 제공 패턴의 발췌입니다 stacktrace?). 어쩌면 nh 초기화 오류를 해결할 수 있습니다. 2. SessionProvider()는 sessionFactory를 사용할 때마다 다시 작성하며, Beatles1692가 지적한대로 리팩토링합니다. 3. 예외가 발생하면 싱글 톤이 손상되지 않습니다. SessionProvider()를 호출 할 때마다 init이 작동하여 응용 프로그램이 제대로 작동합니다. – Jaguar