SqlDataSource 是不是始终保持数据库连接打开?

Posted

技术标签:

【中文标题】SqlDataSource 是不是始终保持数据库连接打开?【英文标题】:Does SqlDataSource keep the database connection open at all times?SqlDataSource 是否始终保持数据库连接打开? 【发布时间】:2013-06-26 18:18:44 【问题描述】:

基本上,我正在开发一个网站,其中将有超过 8 个列表框,其中包含来自数据库的信息。我目前使用SqlDataSource,因为它易于使用,并且目前正在使用它以数据绑定到列表框。

SqlDataSource 是否一直保持连接打开?出于安全原因和性能原因,我想从网站架构的角度消除任何不必要的持续打开的连接。

【问题讨论】:

“我喜欢 SqlDataSource,因为它易于使用” - 但是您是否考虑过结果的质量(可维护性)? 【参考方案1】:

直接回答您的问题:否。SqlDataSource 控件可确保在完成所需执行的操作后立即关闭连接。

【讨论】:

有没有办法根据需要再次打开它以在初始填充后重新填充列表?还是每次我想运行一个新的 selectCommand 时都需要重新初始化它? 您不需要每次都创建一个新实例。您可以更改 SelectCommand,必要时清除所有现有参数,必要时添加新参数,然后调用 Datasource 的 Select 方法。【参考方案2】:

以前用SQLDataAdapter + SQLCommand,现在主要用

using(SQLDataReader rdr = <YourSQLCommandVariable>.ExecuteReader())

    rdr.Load(<YourDataTableVariable))

原因是我不确定数据适配器在数据读取器之上做了什么来允许它进行批量更新、读取和删除。如果您考虑一下,要编写一个像数据适配器这样的类来完成所有这些工作而不会引入任何开销是非常困难的。开销可能并不大,但除非我从查询中读取多个表到 DataSet 对象中,否则我不会冒使用它的风险。

话虽如此,我怀疑这些操作的任何开销是否值得考虑,即使您将所有结果数据本地缓存到本地机器。换句话说,您可以对 SQL 查询做出的最大改进是,如果数据在某个时间范围内不太可能发生变化,则不要进行这些查询。如果数据每天更新一次,请将其缓存 24 小时或更短时间。缓存可以通过 Session(如果它依赖于最终用户)或通过 HttpContext.Current.Cache 对象来完成。

【讨论】:

【参考方案3】:

听起来您可能希望在应用程序中进行一些层分离。理想情况下,Web 项目不了解数据库。理想情况下,有一些中间层组件来处理与数据库的通信。然后从您的 .aspx.cs 或控制器中,根据您是否使用 MVC,您将对中间层进行 8 次调用(假设它们具有不同的信息,则每个列表框调用一次)。中间层将返回类似 List&lt;MyObject&gt; 的内容,然后您将其绑定到列表框。

我的典型数据访问模式如下所示

using (SqlConnection conn = new SqlConnection("conn string"))

    conn.Open();
    SqlCommand command = new SqlCommand()
    
        CommandText = "command text",
        Connection = conn,
        CommandType = CommandType.StoredProcedure //could be non-stored proc.. but would reccomend stored proc assuming SQL Server
    ;

    command.Parameters.Add(new SqlParameter("MyParam", "param1"));
    command.Parameters.Add(new SqlParameter("MyParam2", "param2"));

    IDataReader reader = command.ExecuteReader();

    while(reader.Read())
    
     //magic here
    

    conn.Close();

【讨论】:

以上是关于SqlDataSource 是不是始终保持数据库连接打开?的主要内容,如果未能解决你的问题,请参考以下文章

数据库连接应该始终保持打开状态还是仅在需要时才打开?

在 qlikview 中,是不是可以保持脚本窗口始终打开?

Telerik Reporting - 使用 SqlDataSource 时无法在 Chrome 中导出

WhatsApp 之类的应用程序是不是始终与服务器保持实时连接?

保持数据库连接始终处于活动状态的正确方法

如何为 SqlDataSource 动态绑定变量参数