English 中文(简体)
ASP.NET/ADO.NET:如何在.NET对象中处理多个数据库连接?
原标题:
  • 时间:2008-12-02 17:15:08
  •  标签:

我们有一个.NET对象,它需要频繁地与数据库进行读写交互。在这个对象(或使用它的ASP页)的生命周期中,它可能会执行1到10次的查询/更新操作。

不是每次对象需要访问数据库时都打开和关闭数据库连接,而是在实例化过程中简单地打开与数据库的连接,然后在对象终止事件期间关闭连接。 这是一种不好的做法吗?

假设的前提是,由于每次实例化对象时都要访问数据库(通常是多次),因此最好在对象生命周期的开始时打开连接,然后在结束时关闭连接。

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

这里最佳做法是什么,以实现最大化的绩效?

****update**** Thanks for the tips guys. Can anyone speak more to the method of opening/closing a connection inside an object s instantiation/termination events and the repercussions of doing so?

最佳回答

根据需要打开和关闭连接。 ADO.NET具有内置的连接池,它可以正常工作。除非您在循环中进行成千上万次的打开/关闭操作,否则您不会注意到任何性能问题。

edit See Should I persist a sqlconnection in my data access layer? for more information as to the pitfalls of connection persistence.

问题回答

每次打开和关闭……在执行数据库操作的代码行之前立即打开(尽可能接近),并在之后尽快关闭。以这种方式操作时,ADO.net实际上不会关闭连接,而只是将其释放回ADO.net连接池中,等待下一个使用相同连接字符串的连接请求。您不必每次实际重新创建连接以承担开销。

唯一的问题就是,如果你异步地进行了太多的连接尝试,以至于你超过了池中的最大连接数……而对于这个问题也有解决方案,使用 System.Threading.ThreadPool 类……

为了增加连接池的信任度——保持连接的开放时间超过需要的时间实际上会降低总体性能,因为连接池不能将该连接共享给需要数据库连接的其他组件。

所以,是的,根据需要打开和关闭连接。不过,如果您能将查询批量处理成一个单独的执行调用,那么速度会更快。

Even when ado.net does NOT actually close the connection, when you do: Conn.Close() it executes "sp_reset_connection" at the server, even when sp_reset_connection is a lightweight store procedure, it generate some network traffic. So for example, i would not recommend closing and opening the connection inside a loop.





相关问题
热门标签