我有一个应用程序,它使用NHibernate作为其ORM,有时由于数据被访问的方式而出现性能问题。 有哪些方法可以提高NHibernate的性能?(每个答案请限制为一条建议)
我建议你考虑使用二级缓存来优化NHibernate的性能。二级缓存可用于缓存经常访问的数据,从而减少数据库查询的数量并提高应用程序的响应速度。要使用二级缓存,请配置合适的缓存提供程序,并在需要缓存的实体类上添加适当的缓存设置。我有一个应用程序,它使用NHibernate作为其ORM,有时由于数据被访问的方式而出现性能问题。 有哪些方法可以提高NHibernate的性能?(每个答案请限制为一条建议)
我建议你考虑使用二级缓存来优化NHibernate的性能。二级缓存可用于缓存经常访问的数据,从而减少数据库查询的数量并提高应用程序的响应速度。要使用二级缓存,请配置合适的缓存提供程序,并在需要缓存的实体类上添加适当的缓存设置。我们遇到的一个棘手问题是 SetParameterList()。该函数允许您轻松地将参数列表传递给查询。NHibernate通过为每个传入的项创建一个参数来实现此功能。这导致每个参数数量都有不同的查询计划。我们的执行计划几乎总是从缓存中释放。此外,大量的参数会严重拖慢查询速度。我们对 NHibernate 进行了自定义修改,将项目作为分隔符列表发送到单个参数中。在 SQL Server 中,该列表由我们的修改自动插入到查询的 IN 子句中的表值函数中进行分离。根据您的应用程序可能还存在其他类似的问题。使用 SQL Profiler 可以找到它们。
NHibernate的SessionFactory是一个耗费昂贵的操作,因此一个好的策略是创建一个单例模式,确保内存中只有一个SessionFactory实例:
public class NHibernateSessionManager
{
private readonly ISessionFactory _sessionFactory;
public static readonly NHibernateSessionManager Instance = new NHibernateSessionManager();
private NHibernateSessionManager()
{
if (_sessionFactory == null)
{
System.Diagnostics.Debug.WriteLine("Factory was null - creating one");
_sessionFactory = (new Configuration().Configure().BuildSessionFactory());
}
}
public ISession GetSession()
{
return _sessionFactory.OpenSession();
}
public void Initialize()
{
ISession disposeMe = Instance.GetSession();
}
}
然后在你的 Global.Asax 的 Application_Startup 中,你可以对其进行初始化:
protected void Application_Start()
{
NHibernateSessionManager.Instance.Initialize();
}
不是一则建议,而是一项帮助工具:NH Prof(http://nhprof.com/)似乎很有前途,它可以评估您对ORM框架的使用。这可能是您调整NHibernate的一个良好起点。
没有关于你所遇到的性能问题的具体信息,我只能提供一个概括:在我的经验中,大多数数据库查询性能问题都源于缺乏适当的索引。因此,我的建议是首先检查未建立索引的查询计划。
我只允许限制我的答案为一个选项?在这种情况下,我会选择实现NHibernate的二级缓存机制。
这样,对于映射文件中的每个对象,您都可以定义缓存策略。第二级缓存将在内存中保留已检索的对象,因此不会再次返回数据库。这是一个巨大的性能提升。
您的目标是定义应用程序不断访问的对象。其中包括一般设置等。
有很多关于nhibernate第二级缓存以及如何实现它的信息。
祝你好运 :)