【问题标题】:Handling DB connection breaks处理数据库连接中断
【发布时间】:2011-10-04 11:05:12
【问题描述】:

我的 WCF 服务正在保持数据库连接,以便进一步通过它们发送 SQL。有时连接会因各种原因而中断。早期有一个特殊的计时器,每 1 分钟检查一次连接。但这并不是很好地解决问题。您能否建议我一些保持连接正常工作的方法,或者即使尽快重新连接以提供用户稳定的服务。 谢谢!

编辑: 数据库服务器是 Oracle。我正在使用 devart dotConnect for Oracle 连接到数据库服务器。

【问题讨论】:

  • 池化数据库连接通常不是一个好主意,取决于场景(没有准确说明)我倾向于每次都使用“工作单元”连接。任何池化优势都可以并且将来自连接池本身的内部结构。
  • 发布一些代码。这可能有助于我们用您的上下文中的代码回答问题...
  • @Mr.失望:这已经是答案,而不是评论;-)

标签: c# .net database wcf connection


【解决方案1】:

您不必“保持”数据库连接。将数据库连接的重用和缓存留给 .net 框架。

只需使用这种代码并在使用完后立即处理连接:

using(var connection = new SqlConnection(...))
{
  //Your Code here
}

每次调用数据库都执行上面的代码没有问题。连接信息被缓存,第二次“新”连接到数据库非常快。

要了解有关“ConnectionPooling”的更多信息,您可以阅读此MSDN Articel。

编辑:

如果您使用池连接,则连接并没有真正关闭,而是放回池中。客户端和数据库之间的初始“握手”仅在池上的每个连接中完成一次。

您使用的组件也支持连接池:

Read1 Read 2

【讨论】:

  • 感谢您的回复。有很多对 DB 的密集发送请求,因此保持所有 db 连接打开会变得更快。
  • 我不这么认为。我已经完成了一个事务系统,它在一天内执行了数百万次数据库调用,并且没有对性能造成太大影响。在多个工作单元上共享连接可能非常危险且容易出错。
  • 但是错了。每次从池中取出一个连接时,都会执行一个重置序列来测试连接是否仍然有效,并重置旧连接中仍然遗留的任何/所有片段。在所有sql运行的trace中清晰可见。
  • 也就是说,与运行的 sql 语句相比,开销通常可以忽略不计。
  • 我知道 - 但重用已知连接会更快。我们以这种方式对其进行了优化,系统每秒连接数万次。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-02
  • 1970-01-01
  • 2014-12-22
  • 1970-01-01
  • 1970-01-01
  • 2017-03-16
  • 2015-02-21
相关资源
最近更新 更多