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