【问题标题】:Why are sysprocesses left open on SQL Server for a long time?为什么 sysprocesses 在 SQL Server 上长时间处于打开状态?
【发布时间】:2016-09-26 14:02:58
【问题描述】:

我注意到很多数据库连接在我的生产 SQL Server 上保持打开状态,其中一些连接很长时间。其中许多都有公开交易。如查询所示:

select * from sysprocesses where open_tran>0

它们处于 status = "sleeping", cmd = "AWAITING COMMAND"。

使用 NHIBERNATE 打开连接,如下所示:

For<ISessionFactory>().Singleton()
    .Use(() => DataContext.GetSessionFactory());

For<ISession>().Transient()
  .Use(context => context.GetInstance<ISessionFactory>().OpenSession());

一些会话使用事务范围: _transactionScope = new TransactionScope();

一些创建交易:

_uncommittedTransaction = SessionUncommittedWrapper.Session.BeginTransaction(IsolationLevel.ReadUncommitted);

事务和/或事务作用域在之后被处理。

为什么连接仍然打开?如果没有任何内容被阻止,这是否有问题?

【问题讨论】:

  • 数据库部分受制于应用程序的调用和调用.. 应用程序可以进行数据库调用,并将其保持打开状态,或者它可以打开、执行和关闭.. 很多不好网络编码员打开数据库而不关闭它们,需要一段时间才能注意到关闭它

标签: c# sql-server nhibernate connection-pooling


【解决方案1】:

它们处于 status = "sleeping", cmd = "AWAITING COMMAND"。

当您在 sysprocesses 中看到一行处于睡眠状态时,这意味着此连接处于活动状态,但未被使用。这也是由于 SQLServer 使用了connection Pooling mechanism 而发生的。

等待命令可以通过下面的例子来解释..

会话 1:启动此事务

begin tran
insert into sometable
select some columns

现在,当您在 sys.processes/session DMV 中检查 session1 的状态时,您可以看到它为 Awaiting command..since ,您没有提交它。

等待命令的另一个原因可能是您开始事务并等待用户输入,例如

begin tran
update t
set t1.a=<<some input from user>>--waiting
where t1.a=oldvalue
commit

如果没有任何内容被阻止,这是否有问题?

只要你看到,什么都没有被阻塞,sleeping 和 session 没有持有任何锁并且你没有看到任何打开的事务,你不需要担心。这是由 Bob Dorr in this article.. 解释的。

p>

问题通常出现在持有锁且其状态为睡眠/等待命令的会话周围。如果客户端有一个打开的事务并且客户端没有提交提交或回滚命令,则状态为睡眠/等待命令。我经常看到这个程序超时。

Create proc myProc
As
Begin tran
Update authors ….
 Waitfor delay ’10:00:00’   — time out will occur here  (simulates long workload)
 rollback
go

当以 30 秒的查询超时从客户端运行时,事务将保持打开状态,因为客户端表示它想要“取消执行”并且不进行进一步处理。

要在这种情况下自动回滚,必须启用事务中止。您现在有一个带有 SPID 休眠/等待命令的打开事务。 这种情况可能是由许多其他变化引起的,但它始终是 SQL Server 正在等待来自客户端的下一个命令的情况

【讨论】:

    【解决方案2】:

    基于 NHibernate doc

    Hibernate 依赖于 ADO.NET 数据提供程序实现 连接池。

    连接是打开的,因为重复使用打开的连接可以提高性能。

    更多信息:

    【讨论】:

      猜你喜欢
      • 2020-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多