下午好,我正在将一个相当大的项目迁移到 Fluent NHibernate 以用于单声道。我已经让大部分关键功能运行良好,但是我遇到了内存问题。
目前,此代码在我的两个控制器中。这似乎甚至不是最佳的。但我不确定把这个放在哪里。
private static ISessionFactory CreateSessionFactory()
{
return Fluently.Configure()
.Database(MySQLConfiguration.Standard.ConnectionString(
c => c.FromConnectionStringWithKey("DashboardModels")
))
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<Accounts>())
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<Notes>())
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<Sales_Forecast>())
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<ChangeLog>())
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<Tasks>())
.BuildSessionFactory();
}
ISessionFactory sessionFactory = CreateSessionFactory();
我的大多数数据库调用都是 AJAX,一次触发几个。这让我相信我创建了太多没有被发布的会话。
public ActionResult ReadAccounts([DataSourceRequest] DataSourceRequest request)
{
DataSourceResult result;
using (var session = sessionFactory.OpenStatelessSession())
using (var tx = session.BeginTransaction())
{
var customers = from customer in session.Query<Accounts>().AsNoTracking()
where !customer.Deleted
select customer;
result = customers.ToDataSourceResult(request);
tx.Commit();
}
return Json(result, JsonRequestBehavior.AllowGet);
}
考虑到我将 StatelessSessions 用于仅返回数据的方法。
public JsonResult GetNoteInfo(int id = 0)
{
Notes note;
using (var session = sessionFactory.OpenStatelessSession())
using (var tx = session.BeginTransaction())
{
note = (from notes in session.Query<Notes>().AsNoTracking()
where notes.Note_ID == id
select notes).FirstOrDefault();
tx.Commit();
return Json(JsonResponseFactory.SuccessResponse(note), JsonRequestBehavior.DenyGet);
}
}
正如我所提到的,这是可行的,但是如何提高内存性能呢?大约有 5 种与底部方法类似的方法同时触发,因此如果您之前做过此操作的任何人,请告知如何防止内存快速膨胀,我将不胜感激。感谢您的时间和愉快的编码!