持久数据库连接与打开和;关闭

时间:2011-09-04 21:42:06

标签: c# sql sql-server

我有一个sql server 2k8数据库,每天有数十万条记录。

我目前正在编写一些代码,这些代码将调用db,检索n条记录,处理它们,并将一些数据写回db。

我有两种方法可以做到这一点(伪代码):

function xyz() {
    conn = conn creation code
    conn.open();
    while(not last record) {
        select next 1000 records
        process each record
        last record = true
    }
    conn.close();
    xyz();
}

基本上每批创建一个连接。第二种方法:

function xyz() {
    conn = connection creation code
    while(conn.open();) {
        select next 1000 records
        process each record
        last record = true
    }
    conn.close();
    xyz();
}

我很好奇什么是更好的做法。我觉得它是后者,但它也会与我的数据库建立一个或多或少的永久/持久连接。我担心可能的内存超支或其他一些问题。

思想?

斯科特

4 个答案:

答案 0 :(得分:8)

ADO.Net Sqlclient提供程序(我假设您将使用,因为您说是C#)自动执行连接池,请参阅SQL Server Connection Pooling (ADO.NET)。当您调用Close时,池连接不会真正关闭,它们只是返回池中。 '开放'和'关闭'汇集连接非常快。

无关的说明:您应该在using块中嵌入您的连接:

using (SqlConnection conn = new SqlConnection(...))
{
   conn.Open ();
   ...
}

这样可以避免在异常情况下泄漏连接。

答案 1 :(得分:2)

我将处理函数外部的连接并将其传入。该函数用于处理条目,而不是连接到数据库和进程条目。我会将这两份工作分开。

就连接开启/关闭而言:是的,你应该避免它。它本身并不是非常慢,但如果您只是在进行处理,则没有理由一遍又一遍地打开/关闭连接。如果它是由于内存使用(我不太熟悉C#,所以这部分可能只是错误),你应该释放结果集。关闭连接将释放与其关联的内存,但是,您应该能够在不必重新连接的情况下获得相同的效果。

答案 2 :(得分:1)

这取决于“处理每条记录”的含义。如果需要花费大量时间并且不需要维护连接,您可能需要重新考虑保持连接打开并让池处理它。

但如果它不断地从连接读取/连接,则不应人为地断开/重新连接。

答案 3 :(得分:0)

没有理由继续关闭并重新打开连接。它对数据库和网络造成了不必要的负担。