Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net Web开发和后端呼叫效率_Asp.net_Sql Server - Fatal编程技术网

Asp.net Web开发和后端呼叫效率

Asp.net Web开发和后端呼叫效率,asp.net,sql-server,Asp.net,Sql Server,以下是场景: 您有一个由Microsoft SQL Server数据库支持的ASP.Net应用程序,在本例中不会有任何缓存 对于web应用程序中的每个页面,什么更有效: 试图将所需的所有内容压缩为一个(或几个)存储过程调用,该调用返回多个表,其中包含所需的所有数据(保存到数据集中) 或 使每个调用独立(通过datareader读取每个调用),这取决于逻辑上的意义 我问的原因是我总是以第二种方式结束工作:创建连接到数据库的简单方法,并为我的每个小任务获取一些数据(例如,填充特定下拉列表的方法,另一

以下是场景:

您有一个由Microsoft SQL Server数据库支持的ASP.Net应用程序,在本例中不会有任何缓存

对于web应用程序中的每个页面,什么更有效:

试图将所需的所有内容压缩为一个(或几个)存储过程调用,该调用返回多个表,其中包含所需的所有数据(保存到数据集中)

使每个调用独立(通过datareader读取每个调用),这取决于逻辑上的意义

我问的原因是我总是以第二种方式结束工作:创建连接到数据库的简单方法,并为我的每个小任务获取一些数据(例如,填充特定下拉列表的方法,另一个用于页面主信息的方法,等等)


我担心的是,当请求一个页面时,最终会发生什么,如果我查看服务器的SQL Profiler,最终会有多达10个左右的调用用于该单页面请求。这是不是太过分了?在我看来,通过页面而不是任务来压缩数据收集似乎更有效。任何人都有这方面的经验吗?

我一天的大部分工作是在一个由600多个表的sql server数据库支持的大型WinForms应用程序上工作

我们这样做的第一个方法,以尽量减少网络流量。人们认为,一个鼓鼓囊囊的信封比一个装满信封的邮袋要好


此外,捆绑传输数据不应与紧密耦合混淆——收集数据的SQL可以像以前一样模块化,与伞式存储的过程或视图轻松绑定在一起。

不要按页面对数据收集进行分组。您将数据和演示文稿紧密耦合。如果明天数据必须进入差异页面,该怎么办?

启用连接池后,按照您的建议将多个DB调用合并为一个DB调用没有多大优势(如果有的话)。通过对数据库的多次调用获取所需数据没有什么错,即使每次调用打开和关闭数据库连接也是如此。这是因为启用了池,连接并不是每次都真正打开和关闭

如果您的应用程序是一个Windows客户端应用程序,那么如果客户端和服务器之间的网络速度特别低,那么将调用“捆绑”到一个应用程序中可能是有意义的。您使用的是web应用程序,因此这里的相关连接速度是web服务器和DB服务器之间的连接速度,这应该不是问题


捆绑数据只是额外的工作,没有回报。

如果你真的想知道哪种方法更有效,你必须分析每种方法。每种方法都有太多的变量,可能会在页面之间以及您的代码和我的代码之间产生不同的结果

但一般来说:

  • 多个数据调用太多(sql连接和网络流量开销)

  • 尝试只提取您需要的数据(如果必须,获取一个特定于页面的数据集)

  • 调整查询性能。(使用适当的查询技术(参数化查询/存储过程、适当的索引等)带来的好处将比任何东西都更有帮助)


要添加到Fall和edg的注释中,您应该注意保持数据(模型)和页面(视图/表示)由控制器层隔离。可以使控制器层以您选择的任何一种方式获取视图的数据(以更有效的方式为准)。这种模式(MVC/MVP)将允许您拥有非常可管理和可重用的代码,并允许您在测试不同方法时有更多的回旋余地

不久前,我在组装一个在不同页面上有许多下拉控件的web应用程序时,也遇到了类似的问题。我看了一下SQL Profiler,我得到了超过20个点击,只是为了填充我的下拉列表。这就是我所做的,也许会对你有所帮助

我的选择列表表名称(虚构)

  • pl_用户类型
  • pl_项目类型
  • pl_状态类型
所以我所做的是创建一个静态方法GetPicklistData(String[]tablename),它返回一个数据集。因此,我的页面加载方法如下所示:

protected void Page_Load(object sender, EventArgs e)
{
  DataSet ds = PicklistHelper.GetPicklistData(
      new String[]{"pl_usertypes","pl_projecttypes","pl_stattypes"});
  // Bind dropdowns
  ddl_a.DataSource = ds.Tables[0]; // pl_usertypes
  ddl_a.DataBind();

  ddl_b.DataSource = ds.Tables[1]; // pl_projecttypes
  ddl_b.DataBind();

  ddl_c.DataSource = ds.Tables[2]; // pl_stattypes
  ddl_c.DataBind();
}
所以,当我检查SQL分析器时,它会显示

Select * from pl_usertypes; Select * from pl_projecttypes; Select * from pl_stattypes;
很明显,GetPicklistData()正在构建我的select语句


这可能是我的“肛门”,但嘿,我不知道我为什么要查看SQL分析器

这不取决于您的内容后端更改的频率吗,?您可以“为XML”输出大量内容,并让您的站点阅读XML

连接池可能与“聊天”数据库接口没有太大关系,db服务器上每个请求/响应的开销也是如此;最终发送的数据量相同,但1个请求与10个请求可能会很重要,这当然取决于管道大小和db服务器的功率