gpt4 book ai didi

c# - Fluent NHibernate 中的内存泄漏

转载 作者:太空宇宙 更新时间:2023-11-03 13:46:01 25 4
gpt4 key购买 nike

我正在使用 Fluent NHibernate 作为我们的 ORM,但我收到内存泄漏错误。

我在任务管理器中观察到,每当我尝试从同一台 PC 上的不同 Web 浏览器访问主页时,CPU 使用率是 2-3%,但内存使用率达到 80-90%,这导致网站速度变慢并导致系统挂起。要再次运行我的网站,我必须从任务管理器中结束进程。还有一件事,当我从浏览器访问它时,它会使用一些内存,但是当我关闭它时,它不会释放所有资源(那 block 内存)。

我以这种方式制作了我的网站架构:-

  1. 我创建了一个“ParentObject”类,我在其中创建了 Repository 对象作为静态成员。
  2. 我创建的所有实体都继承自“ParentObject”类。
  3. 我又创建了一个 BaseController 类,它是我从“Controller”类继承而来的,在 Base 类中我使用了这段代码:-

    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
    base.OnActionExecuting(filterContext);
    EdustructRepository Repository; // My Repository Class where I have written logic for opening and closing Save and Update Session.I have mentioned my this logic below
    if (Session["Repository"] != null)
    {
    Repository = (EdustructRepository)Session["Repository"];
    if (!Repository.GetSession().Transaction.IsActive)
    Repository.GetSession().Clear();
    }
    else
    {
    Repository = new EdustructRepository(typeof(ActivityType), FluentNhibernateRepository.DataBaseTypes.MySql);
    Session["Repository"] = Repository;
    }
    if (ParentObject._repository == null)
    {
    ParentObject._repository = new EdustructRepository(); // Here i have set the ParentObject's static variable "_repository" by this i have accessed repository in all my Entities .
    }
    }
  4. 并且我已经使用 BaseController 类继承了我的所有 Controller 。这样我就得到了每个 Action 命中的“_repository”对象。

我的 session 管理逻辑

public class EdustructRepository : NHibernetRepository
{

public void Save<T>(T item, bool clearSession)
{
if (typeof(T).GetProperty("Created_at").GetValue(item, null).ToString() == DateTime.MinValue.ToString())
{
typeof(T).GetProperty("Created_at").SetValue(item, MySqlDateTime.CurrentDateTime(), null);
}
typeof(T).GetProperty("Updated_at").SetValue(item, MySqlDateTime.CurrentDateTime(), null);
base.CheckAndOpenSession();
using (var transaction = base.GetSession().BeginTransaction())
{
try
{
base.GetSession().SaveOrUpdate(item);
transaction.Commit();
if (clearSession)
{
Session.Clear();
}
}
catch
{
base.Evict(item);
base.Clear();
throw;
}
}
//base.Save<T>(item, clearSession);
}

public void Save<T>(T item)
{
Save<T>(item, false);
}
}

public class NHibernetRepository : IDisposable
{
public static ISessionFactory _SessionFactory = null;

protected ISession Session = null;

private ISessionFactory CreateSessionFactory()
{
return Fluently.Configure()
.Database(MySQLConfiguration.Standard.ConnectionString(c => c.FromConnectionStringWithKey("DBConnectionString")))
.Mappings(m =>m.FluentMappings.AddFromAssembly((Assembly.Load("Edustruct.Social.DataModel"))).Conventions.Add<CascadeConvention>())
.ExposeConfiguration(cfg => cfg.SetProperty(NHibernate.Cfg.Environment.CurrentSessionContextClass,"web"))
.BuildSessionFactory();
}

protected void CheckAndOpenSession()
{
if (_SessionFactory == null)
{
_SessionFactory = CreateSessionFactory();
}
if (Session == null)
{
Session = _SessionFactory.OpenSession();
Session.FlushMode = FlushMode.Auto;
}
if (!Session.IsOpen)
Session = _SessionFactory.OpenSession();
else if (!Session.IsConnected)
Session.Reconnect();
}
}

注意:我们没有在我们的存储库中关闭 session ,这是因为我正在使用惰性初始化,我也在 View 中使用过它,所以如果我在这里关闭 session ,我会收到一条错误消息,显示“找不到 session ”。

这就是我让我的网站产生流量的方式。请您查看此代码并告诉我为什么会出现此错误。

在此先感谢您。

最佳答案

问题:

  • 您基本上为每个永久开放的实体举行一次 session 。然而,ISession 实现的工作单元模式并非为此目的。
  • CheckAndOpenSession() 不是线程安全的,但网络服务本质上是线程化的:每个请求通常都有自己的线程。
  • 有什么用

每个业务操作都应该有自己的 session ,并在 session 结束时处理掉。业务操作通常是 Controller 操作或网络方法。

示例

// on appstart
GlobalSessionFactory = CreateSessionFactory();


// in basecontroller befor action
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
DatabaseSession = GlobalSessionFactory.OpenSession();
}

// in basecontroller after action (pseudocode)
protected override void OnActionExecuted()
{
DatabaseSession.Dispose();
}

关于c# - Fluent NHibernate 中的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15311464/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com