gpt4 book ai didi

c# - 在 NHibernate 4 中,如何阻止 PostgreSQL 9.4 建立一堆 'idle in transaction' 连接?

转载 作者:行者123 更新时间:2023-11-29 13:56:26 29 4
gpt4 key购买 nike

我有一个默认使用事务的工作单元对象。有时,我只用它来进行查询,然后不再需要该对象。这就是我正在尝试的:

private void Cleanup()
{
try
{
if (Transactions && transaction != null && !transaction.WasCommitted && transaction.IsActive)
{
transaction.Rollback();
transaction.Dispose();
}


if (!IsStateless)
{
session.Close();
session.Dispose();
}
else
{
statelessSession.Close();
statelessSession.Dispose();

}
} catch (Exception) { }

}


public void Dispose()
{
Cleanup();
}

~BaseUnitOfWork()
{
Cleanup();
}

我还确保将工作单元括在 using 括号中,以确保调用 Dispose()。尽管如此,如果我快速点击我的网站并强制打开这些 session 中的一堆并且大概干净地处理了上述内容,我仍然会得到:

  Timeout while getting a connection from pool.

这是因为我有太多空闲连接:

This from the pgAdmin III Server status window

我怎样才能让所有这些空闲连接消失?我是否正确处理了我的 session ,还是遗漏了什么?

最佳答案

这是我现在的化身。似乎工作正常。

 private void Cleanup(bool fromDispose)
{
try
{
if (Transactions && transaction != null && !transaction.WasCommitted && !transaction.WasRolledBack)
{
transaction.Rollback();

}
}catch (Exception e)
{}
try{
if (!IsStateless && session.IsOpen)
{
session.Close();
session.Dispose();
}
else if (session.IsOpen)
{
statelessSession.Close();
statelessSession.Dispose();

}
} catch (Exception e)
{ }

}



public void Dispose()
{
Cleanup(true);
}

~BaseUnitOfWork()
{
Cleanup(false);
}

如果我将我的工作单元包含在“using”语句中,则当它超出范围时会触发处置。否则,当垃圾收集器开始处理对象时,它们最终都会关闭。

关于c# - 在 NHibernate 4 中,如何阻止 PostgreSQL 9.4 建立一堆 'idle in transaction' 连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30906480/

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