【发布时间】:2011-02-14 16:07:23
【问题描述】:
我需要为列表中的每个项目运行一个存储过程(来自 ASP .NET 应用程序)。我有一个服务框架,它允许我用最少的代码行来做到这一点,但我担心使用这种方法会效率低下。每次调用服务方法,都会打开一个数据库连接,运行存储过程,然后关闭数据库连接。这很安全,但调用 20 个项目可能有点慢,我需要尽可能快。
什么是更有效的方法?
【问题讨论】:
我需要为列表中的每个项目运行一个存储过程(来自 ASP .NET 应用程序)。我有一个服务框架,它允许我用最少的代码行来做到这一点,但我担心使用这种方法会效率低下。每次调用服务方法,都会打开一个数据库连接,运行存储过程,然后关闭数据库连接。这很安全,但调用 20 个项目可能有点慢,我需要尽可能快。
什么是更有效的方法?
【问题讨论】:
好吧,如果您使用的是 ADO.Net,那么即使您正在“关闭”连接 ADO.Net 引擎默认情况下只会将连接放回其缓存(连接池)以供重用,所以它不是没你想的那么贵……
但是,如果您想避免每个项目的往返,请将所有项目传递给一个管道分隔列表(或其他一些技术),并编写一个存储过程,在一个集合中一次处理它们 -基于操作。这将使您获得最佳性能。
您知道这里根本存在性能问题吗?
【讨论】:
除非您确实发现它是一个瓶颈,否则我不会担心它。默认情况下,从 System.Data.SqlClient.SqlConnection 类(以及我想像 Oracle 等其他提供程序)到 SQL Server 的连接是池化的,因此打开 SqlConnection 和 actual 数据库连接。
不过,严格来说,它确实需要 一些 时间(即使它可能可以忽略不计),因此使其更快的唯一方法是:
例如:
using(SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandType = CommandType.Text;
cmd.CommandText = @"
exec YourProcedure @param1;
exec YourProcedure @param2;
exec YourProcedure @param3;";
cmd.ExecuteNonQuery();
}
但是,鉴于您的项目数量可能是动态的,您基本上必须动态生成此 SQL(尽管仍然参数化所有用户提供的值!)。
【讨论】:
即使您努力工作但效率低下,20 项也不算多。如果您使用 SQL Server 和 ADO.NET 提供程序,连接池将自动帮助您.我认为您不必担心太多。
【讨论】:
【讨论】: