【问题标题】:ASP.NET/ADO.NET: Handling many database connections inside a .NET Object?ASP.NET/ADO.NET:在 .NET 对象中处理许多数据库连接?
【发布时间】:2010-09-24 23:38:46
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: .net asp.net ado.net oop database-connection


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      编辑 有关连接持久性缺陷的更多信息,请参阅Should I persist a sqlconnection in my data access layer?

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

            猜你喜欢
            • 2010-09-25
            • 1970-01-01
            • 1970-01-01
            • 2012-03-02
            • 1970-01-01
            • 1970-01-01
            • 2021-07-27
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多