Sql数据源是否始终保持数据库连接处于打开状态
本文关键字:连接处 于打开 状态 数据库 始终保持 数据源 是否 Sql | 更新日期: 2023-09-27 18:19:57
>基本上我有一个网站,我正在开发的网站,其中将有超过 8 个列表框填充来自数据库的信息。由于易于使用,我目前使用 SqlDataSource
,并且正在使用它当前数据绑定到列表框。
SqlDataSource
是否一直保持连接打开状态?我想从网站架构的角度来看,出于安全原因和性能原因,消除任何不必要的持续打开的连接。
直接回答您的问题:不。控件可确保在完成需要执行的操作后立即关闭连接。
我曾经使用SQLDataAdapter + SQLCommand,但现在我主要使用
using(SQLDataReader rdr = <YourSQLCommandVariable>.ExecuteReader())
{
rdr.Load(<YourDataTableVariable))
}
原因是我不确定数据适配器在数据读取器顶部做了什么,以允许它进行批量更新、读取和删除。如果您考虑一下,编写像数据适配器这样的类将非常困难,它可以在不引入任何开销的情况下完成所有这些操作。开销可能不大,但除非我将多个表从查询中读取到 DataSet 对象中,否则我不会冒使用它的风险。
话虽如此,如果您将所有结果数据本地缓存到本地机器中,我怀疑这些操作的任何开销是否值得考虑。换句话说,您可以对 SQL 查询进行的最大改进是,如果数据在某个时间范围内不太可能更改,则不要进行查询。如果数据每天更新一次,请将其缓存 24 小时或更短时间。缓存可以通过会话(如果它依赖于最终用户(或通过 HttpContext.Current.Cache 对象完成。
听起来您可能希望在应用程序中进行一些层分离。 理想情况下,Web 项目不了解数据库。 理想情况下,有一些中间层程序集处理与数据库的通信。 然后,从您的.aspx.cs或控制器中,根据您是否使用 MVC,您将对中间层进行 8 次调用(假设每个列表框具有不同的信息,则一个(。 中间层将返回类似于List<MyObject>
的内容,然后您将将其绑定到列表框。
我的典型数据访问模式如下所示
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();
}