MakesureNHibernateSessionFactoryiscreatedonlyonce我写了一个NHibernateSessionFactory类,它包含一个静态的NhibernateISessionFactory。这用于确保我们只有一个会话工厂,并且第一次调用OpenSession()我创建了一个实际的SessionFactory-下次我使用它并在其上打开一个会话。代码如下:publicclassNhibernateSessionFactory:INhibernateSessionFactory{privatestaticISessionFactory_sessionFactory;publicISessionOpenSession(){if(_sessionFactory==null){varcfg=Fluently.Configure().Database(SQLiteConfiguration.StandardFile().ShowSq("Foo.db")).Mappings(m=>m.FluentMappings.AddFromAssemblyOf());_sessionFactory=cfg.BuildSessionFactory();构建架构(cfg);}返回_sessionFactory.OpenSession();}privatestaticvoidBuildSchema(FluentConfigurationconfiguration){varsessionSource=newSessionSource(configuration);varsession=sessionSource.CreateSession();sessionSource.BuildSchema(session);现在我有一个问题。我的应用程序分为客户端和服务器。Nhibernate的东西在服务器端。在启动时,我的客户端和服务器都希望通过一些将使用NhibernateSessionFactory的服务来访问数据库。结果是在请求来自客户端之前是否创建了带有_sessionFactory的竞争条件。如果不是,它会失败。我想我需要在NhibernateSessionFactory中使用某种排队或等待机制,但我不知道如何做。以前有没有人遇到过同样的问题?什么是最好的解决方案?sessionFactory必须是线程安全的单例。Java中的一种常见模式是在静态初始化程序中构建sessionFactory。请参见HibernateUtil。您可以在C#中执行相同的操作。还有其他模式可以实现单例,包括使用锁定或同步部分。这是一个细微的变化,如果我理解正确的话,应该可以解决您的问题。静态只读对象工厂锁=新对象();publicISessionOpenSession(){lock(factorylock){if(_sessionFactory==null){varcfg=Fluently.Configure().Database(SQLiteConfiguration.Standard.ShowSql().UsingFile("Foo.db")).Mappings(m=>m.FluentMappings.AddFromAssemblyOf());_sessionFactory=cfg.BuildSessionFactory();构建架构(cfg);}}返回_sessionFactory.OpenSession();当我使用Mutex创建SessionFactory时解决了这个问题。这看起来合理吗:publicclassNhibernateSessionFactory:INhibernateSessionFactory{私有静态互斥量_mutex=newMutex();//m.FluentMappings.AddFromAssemblyOf());_sessionFactory=cfg.BuildSessionFactory(ma);}//看起来很有魅力。但是我应该使用锁吗?以上就是C#学习教程:保证NHibernateSessionFactory只创建一次共享的所有内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权请点击右侧联系管理员删除。如需转载请注明出处:
