基本上,我有一个正在开发的网站,其中将有超过 8 个列表框,其中包含来自数据库的信息。我目前使用SqlDataSource
它是因为易于使用,并且正在使用它当前数据绑定到列表框。
是否SqlDataSource
让连接一直打开?出于安全原因和性能原因,我想从网站架构的角度消除任何不必要的持续打开的连接。
基本上,我有一个正在开发的网站,其中将有超过 8 个列表框,其中包含来自数据库的信息。我目前使用SqlDataSource
它是因为易于使用,并且正在使用它当前数据绑定到列表框。
是否SqlDataSource
让连接一直打开?出于安全原因和性能原因,我想从网站架构的角度消除任何不必要的持续打开的连接。
直接回答您的问题:否。SqlDataSource 控件确保在完成所需执行的操作后立即关闭连接。
我以前使用 SQLDataAdapter + SQLCommand,但现在我主要使用
using(SQLDataReader rdr = <YourSQLCommandVariable>.ExecuteReader())
{
rdr.Load(<YourDataTableVariable))
}
原因是我不确定数据适配器在数据读取器之上做了什么来允许它进行批量更新、读取和删除。如果你仔细想想,要编写一个像数据适配器这样的类来完成所有这些,而不引入任何开销是非常困难的。开销可能并不大,但除非我从查询中读取多个表到 DataSet 对象中,否则我不会冒使用它的风险。
话虽如此,如果您将所有结果数据本地缓存到本地机器中,我怀疑这些操作的任何开销是否值得考虑。换句话说,您可以对 SQL 查询进行的最大改进是,如果数据在某个时间范围内不太可能发生变化,则不要进行这些查询。如果数据每天更新一次,请将其缓存 24 小时或更短时间。缓存可以通过 Session (如果它依赖于最终用户)或通过 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();
}