3

我们有一个 .NET 对象,它对数据库进行大量读/写操作。在此对象(或使用它的 asp 页面)的整个生命周期中,它可能会通过查询/更新访问数据库 1 到 10 次。

不是每次对象需要访问数据库时打开和关闭数据库连接,它只是在实例化期间打开到数据库的连接,然后在对象的终止事件期间关闭连接。这是一个坏习惯吗?

假设是,由于对象每次实例化(通常是多次)都会访问数据库,所以最好在对象生命的开始时打开一个连接,然后在结束时关闭它。

另一种选择是在每次查询/操作之前和之后打开和关闭数据库连接。

为了最大限度地提高性能,这里的最佳做法是什么?

****更新****感谢您的提示。谁能更多地谈论在对象的实例化/终止事件中打开/关闭连接的方法以及这样做的后果?

4

4 回答 4

10

根据需要打开关闭连接。ADO.NET 内置了可以工作的连接池。除非您在数千个打开/关闭的循环中执行此操作,否则您不会注意到任何性能问题。

编辑 请参阅我应该在我的数据访问层中保留一个 sqlconnection 吗?有关连接持久性陷阱的更多信息。

于 2008-12-02T17:20:22.807 回答
4

每次打开和关闭...在实际执行数据库操作的代码行之前立即打开(尽可能关闭),之后立即关闭。当您以这种方式执行此操作时,ADO.net 实际上并没有关闭连接,它只是将其释放回 ADO.net 连接池,它坐在那里等待下一个具有相同连接字符串的连接请求。您不会每次都实际重新创建连接的开销...

唯一的问题是,如果您异步执行的连接尝试次数超过池中的最大连接数......并且使用 System.Threading.ThreadPool 类也有解决此问题的方法......

于 2008-12-02T17:20:40.793 回答
2

为了增加对连接池参数的信任 - 保持连接打开的时间超过需要实际上会降低整体性能,因为连接池无法将该连接共享给需要数据库连接的其他组件。

所以,是的,根据需要打开和关闭连接。但是,如果您可以将查询批处理到单个 exec 调用中,它会更快。

于 2008-12-02T17:57:58.660 回答
1

即使 ado.net 实际上没有关闭连接,当您这样做时: Conn.Close() 它会在服务器上执行“sp_reset_connection”,即使 sp_reset_connection 是轻量级存储过程,它也会产生一些网络流量。因此,例如,我不建议在循环内关闭和打开连接。

于 2009-05-19T15:23:08.263 回答