【发布时间】:2009-09-15 10:37:46
【问题描述】:
我目前正在创建一个系统,在某些情况下,如果数据库不可用,则改用 MSMQ。例如。如果应用程序(在其中一种情况下是 wcf Web 服务)启动,并且数据库不可用,则所有传入请求都应写入 MSMQ。当数据库再次可用时,应再次将请求写入数据库。 我正在使用 NHibernate,会话工厂由单例包装。这是服务的样子:
try
{
// to database (just an example)
SessionProvider.Current.CurrentSession.Save...
}
catch(NHibernate.ADOException)
{
// to msmq
}
当服务启动并运行一段时间并且会话工厂已构建时,此设置有效。停止 SQL Server 时会引发 ADO 异常,并将内容正确写入 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();
}
}
【问题讨论】:
-
1.您可以完整发布错误(可能带有堆栈跟踪吗?)。也许可以解决 nh init 错误。 2.您的 SessionProvider() 每次使用时都会重新构建 sessionFactory,正如 Beatles1692 所指出的那样进行重构。 3.如果发生异常,您的单例不会损坏。对于初始化工作的 SessionProvider() 的每个后续调用,您的应用程序将正常工作
标签: nhibernate