我目前正在创建一个系统,在某些情况下,如果数据库不可用,则使用MSMQ。例如。如果应用程序(在其中一种情况下是wcf Web服务)启动,并且数据库不可用,则应将所有传入请求写入MSMQ。当数据库再次可用时,请求应再次写入数据库。 我正在使用NHibernate,会话工厂由单例包装。这就是服务的样子:
try
{
// to database (just an example)
SessionProvider.Current.CurrentSession.Save...
}
catch(NHibernate.ADOException)
{
// to msmq
}
当服务启动并运行一段时间并且会话工厂已构建时,此设置有效。停止SQL服务器时,会引发异常,并将正确的内容写入MSMQ。
现在我的问题。如果数据库在第一次启动服务之前不可用,则无法构建会话工厂并抛出TypeInitializationException。我的单身会话提供商现已破产。所以当数据库再次运行时,我不知何故需要一种方法来重建会话工厂。我会做那个计时器吗?就像每5分钟尝试重建一次一样?我怎样才能'重新''单身?
以下是我正在使用的会话提供程序模式的摘录:
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();
}
}
答案 0 :(得分:1)
我建议你改变你的SessionProvider:
...
private ISessionFactory sessionFactory;
private Configuration config;
private SessionProvider()
{
config= new Configuration();
config.Configure();
}
public static ISessionFactory SessionFactory
{
get
{
if(sessionFactory==null)
sessionFactory=config.BuildSessionFactory();
return Nested.SessionProvider.sessionFactory;
}
}
...