减少往返数据库的往返次数

时间:2013-02-27 08:39:34

标签: asp.net database-connection

我正在使用ASP.NET Web窗体并尝试从SQL Server加载数据。这是关于我如何做的伪代码:

connect1 = connect("database")
categories = connect.query("select * from category")
loop categories as category

     print category           

     connect2 = connect("database")
     subCategories = connect2.query("select * from subCategory where category = @0", category) 
     loop subCategories as subCategory

           print subCategory               

           connect3 = connect("database")
           items = connect3.query("select * from item where subCategory = @0", subCategory)
           loop items as item
                 print item
           end loop 'items
           connect3.close

     end loop 'subcategories
     connect2.close

end loop 'categories
connect1.close

正如你所看到的,我的脚本中有很多往返行程,当我只有很少的记录时这很好,但是当处理数百或更多时,这需要永远显示数据。

我可以做些什么来减少往返次数?我想从数据库中一次获取所有数据,然后在应用程序端对它们进行分类,但这可能吗?

2 个答案:

答案 0 :(得分:2)

为什么不通过一个带有连接的查询获得所需的所有数据,然后在客户端进行过滤;或者你可以做的其他方式(它没有太多数据)将数据作为xml获取,将其反序列化为可迭代的迭代。

我认为你做了

categories = connect.query("select * from category");

所以你需要的只是:

whole_data = connect.query("select * from category c inner join subCategory sc on c.id = sc.id inner join item i on i.id = si.id") /*or some kind of*/
/*let me think that whole_data is a list of objects, not a dataset*/
categories = whole_data.Distinct(d => d.category);
subCategories = whole_data.Distinct(d => d.subCategories);
/*and then do your loops*/
用于手动映射的c#代码可能是这样的:

        using (var connection = new SqlConnection(connString))
        {
            connection.Open();
            var command = connection.CreateCommand();
            command.CommandText = "select * from ...";

            var reader = command.ExecuteReader();
            while (reader.Read())
            {
                var a = reader.GetInt32(0);
                var b = reader.GetString(1);
                /*so basically you read all fields that you get from DB and build object here, then you add it to List or any other kind of collection*/
            }
        }

答案 1 :(得分:1)

根据数据库的延迟,即使合并,建立连接也需要很长时间。为了避免这种问题,请在循环外部进行所有连接。也就是说,不要嵌套连接。相反,结构如下:

Connect1 = connect("database")
Connect2 = connect("database")
Connect3 = connect("database")

sql 1 nest
    sql 2 nest
        sql 3 nest
        end nest
    end nest
end nest

close connections.

如果每个循环有10个条目,并且连接需要10毫秒,那么只需要10 x 10 x 10 = 1000 mS即可进行连接。把它们带到巢外,然后你只用30 mS就可以了。在每个嵌套完成时关闭datareader,以便重用连接。

当然,对于您展示的示例,执行单个查询是最佳解决方案。 但是,如果您的查询是有选择性的,并且您需要执行一些无法在查询中组合的业务逻辑,那么请始终将您的连接移到循环之外。