【问题标题】:Closing SQL connections (NHibernate)关闭 SQL 连接 (NHibernate)
【发布时间】:2010-01-26 22:26:23
【问题描述】:

我有一个测试控制台应用程序,它正在执行 sql 脚本来创建数据库及其表,然后插入数据。我使用 DAO 从表中创建、检索、更新和删除,然后尝试删除数据库,但它不能,因为它说它当前正在使用中。如何终止连接?通过调试和运行一个 sql 脚本来查看总连接数,我将其范围缩小到这段没有杀死连接的代码。即使它说连接已清除,但数据库说它仍然连接。

foreach (ISessionFactory factory in this.connections.Values)
{
    factory.Close();
}

this.connections.Clear();
this.connections = null;

【问题讨论】:

  • 通常情况下,您不必关闭 sessionfactory。为什么你有多个会话工厂?您的代码中的其他地方可能存在打开的连接。

标签: sql nhibernate connection


【解决方案1】:

NHibernate 自己管理所有数据库连接。它会根据需要打开和关闭数据库,但您可以尝试调用 Session.Disconnect 以使其与 ADO.NET 连接断开。

但是...如果您启用了连接池,这通常是“默认”连接行为,则连接只会返回到连接池,而不是释放,它仍然会显示为连接,所以你会必须清除连接池。

不幸的是,我不知道您是否可以直接通过 NHibernate 执行此操作,但是您可以使用 SQLConnection 对象发出 ClearPool 或 ClearAllPools 调用...

【讨论】:

  • 谢谢!我最初是在清除代码中的池,但它不起作用,所以我尝试在连接字符串中使用 Pooling=false ,它似乎可以解决问题。为什么它在连接字符串中而不是在代码中起作用让我感到震惊。
  • 连接池是个好东西。池中的连接不会保持任何事务打开或消耗任何资源,因此您不需要“清理”它。另一方面,当池中有可用的连接时,您也不必创建新连接。 “清理”池肯定会损害性能
猜你喜欢
  • 1970-01-01
  • 2017-09-16
  • 2016-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多