持久化数据库连接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();
}
我很好奇什么是更好的练习。我觉得是后者,但它也将有一个或多或少的永久/持久连接到我的数据库。我担心可能会出现内存溢出之类的问题。
想法吗?
斯科特ADO。. Net Sqlclient提供程序(我假设您将使用,因为您说的是c#)自动执行连接池,请参阅SQL Server连接池(ADO.NET)。当调用Close时,池连接并没有真正关闭,它们只是返回到池中。"打开"answers"关闭"连接池非常快。
不相关的注意:你应该嵌入你的连接在using
块:
using (SqlConnection conn = new SqlConnection(...))
{
conn.Open ();
...
}
这样可以避免异常情况下的连接泄漏
我将在函数外部处理连接并将其传递进去。该函数设计用于处理条目,而不是连接到数据库并处理条目。我会把这两份工作分开。
至于打开/关闭连接:是的,你应该避免它。它本身并不是很慢,但如果你只是在做处理,没有理由一次又一次地打开/关闭连接。如果是由于内存使用(顺便说一下,我对c#不太熟悉,所以这部分可能是错误的),您应该释放结果集。关闭连接将释放与之相关的内存,但是,您应该能够获得相同的效果,而无需重新连接。
这取决于"处理每条记录"是什么意思。如果这需要花费大量的时间,并且不需要维护连接,那么您可能需要重新考虑保持连接打开并让池处理它。
但如果它不断地从连接中读取/到连接,则不应该人为地断开/重新连接。
没有理由继续关闭和重新打开连接。这会给数据库和网络带来不必要的负担。