持久化数据库连接vs打开&关闭

本文关键字:关闭 打开 vs 数据库连接 持久化 | 更新日期: 2023-09-27 18:07:50

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

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

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

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();
}

我很好奇什么是更好的练习。我觉得是后者,但它也将有一个或多或少的永久/持久连接到我的数据库。我担心可能会出现内存溢出之类的问题。

想法吗?

斯科特

持久化数据库连接vs打开&关闭

ADO。. Net Sqlclient提供程序(我假设您将使用,因为您说的是c#)自动执行连接池,请参阅SQL Server连接池(ADO.NET)。当调用Close时,池连接并没有真正关闭,它们只是返回到池中。"打开"answers"关闭"连接池非常快。

不相关的注意:你应该嵌入你的连接在using块:

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

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

我将在函数外部处理连接并将其传递进去。该函数设计用于处理条目,而不是连接到数据库并处理条目。我会把这两份工作分开。

至于打开/关闭连接:是的,你应该避免它。它本身并不是很慢,但如果你只是在做处理,没有理由一次又一次地打开/关闭连接。如果是由于内存使用(顺便说一下,我对c#不太熟悉,所以这部分可能是错误的),您应该释放结果集。关闭连接将释放与之相关的内存,但是,您应该能够获得相同的效果,而无需重新连接。

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

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

没有理由继续关闭和重新打开连接。这会给数据库和网络带来不必要的负担。