我有一个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();
}
我很好奇什么是更好的做法。我觉得它是后者,但它也会与我的数据库建立一个或多或少的永久/持久连接。我担心可能的内存超支或其他一些问题。
思想?
斯科特
答案 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)
没有理由继续关闭并重新打开连接。它对数据库和网络造成了不必要的负担。