【问题标题】:Having sql connection open for a long time长时间打开sql连接
【发布时间】:2013-05-07 10:11:38
【问题描述】:
我正在编写一个生成站点地图的程序。为了避免重复,我使用 MSSQL Server 来存储找到的链接。在这个过程中可能会读写数百万个链接,读写过程之间的间隔可能很小(我的意思是每次访问数据库之间的时间很短)。
我想知道我是否可以在程序启动时打开连接并在最后关闭它。请考虑创建一些站点地图可能需要几天时间才能完成。或者每次我想访问数据库时打开和关闭连接是否明智?
顺便说一下,我在本地使用sql server。
【问题讨论】:
标签:
c#
sql-server-2008
database-connection
【解决方案1】:
您的问题的答案是Connection Pooling 功能。
最好在需要时打开连接,访问您的数据,立即关闭并释放连接
确实存在特定的工作模式
using(SqlConnection con = new SqlConnection(.....))
{
... do your work with the database here ....
}
using statement 确保在开口处创建的对象是闭合的并被放置在闭合大括号处。 即使在数据库代码中发生异常。
这并不意味着您不能尝试优化您的代码。例如,您可以将几个站点地图收集在一起并一口气编写它们,但通常最好遵循简单的工作模式,尽快完成工作并担心以后的优化。
【解决方案2】:
您可以使用以下代码:
SqlConnection conn;
try
{
conn = new SqlConnection(_dbconnstr));
}
catch
{
//exceptions are bubbled
throw;
}
finally
{
//Dispose is always called
conn.Dispose();
}
希望这会有所帮助!
【解决方案3】:
我通常在每次使用时打开和关闭连接。
当周围有很多连接时,必须释放资源。
如果你是唯一的人,你可能会保留你的资源。
注意设置超时连接。
祝你好运!
【解决方案4】:
最好打开/关闭连接。将连接打开没有任何好处。 ADO.NET Connection pooling(默认开启)将负责关闭哪个连接以及何时关闭。
来自MSDN
CAUTION 建议您在以下情况下始终关闭连接
您已完成使用它以便返回连接
到游泳池。这可以使用 Close 或 Dispose 来完成
Connection 对象的方法。未明确的连接
关闭可能不会被添加或返回到池中。例如,一个
超出范围但未明确说明的连接
关闭只会返回到连接池,如果最大
已达到池大小,连接仍然有效。
【解决方案5】:
如果你知道这需要一段时间,那么写入本地数据表,然后当达到阈值时,将所有记录写入数据库。
或者甚至将信息写入本地文件(您选择的格式),然后将该文件一次性写入数据库(如果您想每 x 条记录或 y 分钟执行一次,则可以多次写入数据库。)