【问题标题】:Is it ok to leave a sql connection open?是否可以打开 sql 连接?
【发布时间】:2011-08-16 01:13:11
【问题描述】:

我正在通过一个 com 端口连续接收数据并进行一些解码。解码完成后,我必须将结果存储在 sql 数据库中。我在想,因为解码已经完成(在一个while循环中总是运行)每秒几十次,如果明智地打开和关闭与sql server的连接,数据需要每秒存储到数据库中几十次每个 while 循环或只是将其保持打开状态并继续将数据写入数据库。 首先这可能吗?其次,如果连接保持打开状态,第三方应用程序或计算机是否可以在我的程序存储数据的同时访问数据库并读取数据?

【问题讨论】:

  • 还有一件事。我可以每秒打开和关闭几次连接,或者有超时或类似的东西阻止经常使用吗?
  • 程序将 24/7 运行。这意味着永远不要关闭连接
  • 就我个人而言,我打开/关闭以避免混淆范围/生命周期中的传输——即使它可能不需要。如果存在感知性能问题,则进行基准测试(正如其他人指出的那样,池化基本上否定了这一点)。但是,请务必管理事务。即使数据库保持打开状态,请记住根据需要commit。否则数据可能永远不会被提交或锁可能永远不会被释放:)

标签: c# sql connection


【解决方案1】:

一个数据库支持多个并发连接,所以是的,在这种情况下让数据库连接保持打开状态是非常可行的——如果你有一个长时间运行的查询会导致行/表锁定,你只会锁定其他连接。完成后关闭连接即可。

还要考虑尽管大多数 DB(即 SQL Server)在内部使用 connection pooling,所以即使您关闭了一个 DB 连接,它也只是回到池中并且没有物理关闭 - 池管理物理 DB 连接 - 这个带来更好的性能,因此减少了快速打开/关闭连接的影响。

来自MSDN

连接池减少了新连接的次数 必须打开。池子保持物理的所有权 联系。它通过保持一组活动来管理连接 每个给定连接配置的连接。每当用户 在连接上调用 Open,池化程序会寻找可用的 池中的连接。如果一个池连接可用,它 将其返回给调用者,而不是打开新连接。当。。。的时候 应用程序在连接上调用 Close,pooler 将其返回给 池化的活动连接集,而不是关闭它。一旦 连接被返回到池中,它已准备好在 下一次公开通话。

【讨论】:

  • 其实我不会那样做。根据需要打开/关闭,让连接池完成它的设计目的。
  • 池是否自动启用?
  • @redfrogsbinary:除非您明确禁用它,否则默认开启
【解决方案2】:

我会打开连接,根据需要多次循环,然后关闭连接。打开和关闭非常昂贵。但是,多亏了 Mitch Wheat 和 Dave Markle,我了解到连接池是在 .NET 的后台免费完成的,所以费用应该分摊在您的所有请求中。

更好的是,我会在循环中批处理请求并在循环完成后执行批处理。这样,您只需要一次网络往返。

如果您同意最后一点,我会确保批处理 INSERT 是在事务上下文中完成的,因此它可以作为单个工作单元提交或回滚。隔离和线程安全很重要。

【讨论】:

  • "开合很贵。" - 首次开放是;之后,如果连接字符串相同,则应该启动连接池。但正如您所说,批处理请求。
  • 循环永远不会结束。这就是保持 com 端口打开的原因
  • 虽然打开和关闭 开销很大,但他使用的是 C#,这可能意味着他有连接池在后台为他工作,这几乎完全缓解了这个问题。
  • 假设使用了一个池,米奇。没有初步迹象表明有人在玩。如果你看到一个,我同意。我没有意识到 .NET 中的池是免费的。如果是这样,我会修改我的答案。
  • 池是否自动启用?
【解决方案3】:

我个人每次都会打开和关闭连接。您应该以任何异常最终都会关闭您的连接的方式保护您的代码。您的应用程序会是唯一与该数据库通信的应用程序吗?

【讨论】:

  • 在这种情况下,我会谨慎地保持连接超过必要的时间。
  • 在我的情况下每次都会在循环中
  • 正确。我只会在还有要读或写的东西时保持连接打开。如果您正在等待其他流程/步骤完成,我会关闭连接。
【解决方案4】:

其实你必须显式关闭SqlConnection.Open()

来自 MSDN,“注意如果 SqlConnection 超出范围,它不会关闭。因此,您必须通过调用 Close 或 Dispose 显式关闭连接。”

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.open(v=vs.71).aspx

干杯!

【讨论】:

    猜你喜欢
    • 2020-05-14
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多