我正在使用Fluent NHibernate,我喜欢它! 我有一个小问题:启动时间大约是10秒,我不知道如何优化Fluent nHibernate 为了使这个启动时间不那么成问题,我把它放在一个线程上。
有人能解决这个问题吗?并回复以下修改后的代码以提高性能?
我看到这样的事情: http://nhforge.org/blogs/nhibernate/archive/2009/03/13/an-improvement-on-sessionfactory-initialization.aspx 但是我不知道如何与Fluent nHibernate一起工作。
我的代码是这样的:
public static ISession ObterSessao()
{
System.Threading.Thread.CurrentThread.Priority = System.Threading.ThreadPriority.Highest;
string ConnectionString = ConfigurationHelper.LeConfiguracaoWeb("EstoqueDBNet"); // My Connection string goes here
var config = Fluently.Configure()
.Database(FluentNHibernate.Cfg.Db.MySQLConfiguration.Standard.ConnectionString(ConnectionString));
config.Mappings(m => m.FluentMappings.AddFromAssembly(Assembly.GetExecutingAssembly()));
var session = config
.BuildSessionFactory()
.OpenSession();
System.Threading.Thread.CurrentThread.Priority = System.Threading.ThreadPriority.Normal;
return session;
}
答案 0 :(得分:5)
您只需要构建一次配置。目前,每次进行会话时都要构建新配置。
答案 1 :(得分:2)
首先,不要乱用线程优先级,如果你正在做什么会使它变慢。
其次,就像Phill所说,你需要缓存你的SessionFactory,否则你每次需要会话对象时都会重建配置。
你可以这样做,或者将if
中的代码移动到类'静态构造函数中:
private static SessionFactory _factory = null;
public static ISession ObterSessao()
{
if(_factory == null) {
string ConnectionString = ConfigurationHelper.LeConfiguracaoWeb("EstoqueDBNet"); // My Connection string goes here
var config = Fluently.Configure()
.Database(FluentNHibernate.Cfg.Db.MySQLConfiguration.Standard.ConnectionString(ConnectionString));
config.Mappings(m => m.FluentMappings.AddFromAssembly(Assembly.GetExecutingAssembly()));
_factory = config.BuildSessionFactory();
}
return _factory.OpenSession();
}
答案 2 :(得分:2)
Phill有正确的答案,但为了进一步了解http://nhibernate.info/blog/2009/03/13/an-improvement-on-sessionfactory-initialization.html将NHibernate配置序列化为文件,所以每次启动应用程序时都不必重建它。根据各种因素(主要是您拥有的映射数量),这可能会或可能不会更快一点 - 根据这一点,Is there any data on NHibernate vs Fluent NHibernate startup performance?
为了强调(基于你在answer-comments中的一些后续qns),你应该序列化(NHibernate.Cfg。)配置对象,而不是SessionFactory。
然后,在创建FluentConfiguration时使用Fluently.Configure(Configuration cfg)
重载来注入配置(而不是让它自动为您构建一个)。