如何绕过等待操作超时'

时间:2016-06-28 13:32:57

标签: c# database linq bulkinsert connection-timeout

我正在用c构建电子商务系统。 10000个产品,每个有15个品种,每个都有独特的价格来匹配,所以c。 150,000产品价格。价格每天都有所不同,这些价格以CSV格式发送给我们,我们自动进口以重新编写新价格的整个数据库表,因为95%以上的价格每天都在变化。由于这个数字,我们在每个价格上都有一个标志,表明该价格是否是网站上可见的价格。

我们导入后,昨天在网站上的价格(因此被标记为可见),以及新的但未在网站上的价格在C#控制台行程序中切换了它们的标志,使用此LINQ命令: -

db.Database.ExecuteSqlCommand("UPDATE [MyDatabase].[dbo].[ProductVariationPrice] SET IsVisible = IsVisible ^ 1");

所以标记为IsVisible的所有内容现在都不可见,反之亦然。即使对于300,000行,这也只需不到一秒,然后我们删除设置为IsVisible = 1的行范围。

在此之前,我们使用BulkInsert快速插入行,并使用LINQ' RemoveRange删除要删除的不可见项。

最初这很好,但我现在正在吸引电子商务网站上的用户,等待操作时间超时'数据标志切换的确切时间段内的错误以及旧数据被删除。

如何在此期间停止此等待操作超时?我被告知我们不能做的事情: -

  • 更新每条记录,而不是重写整个表格(花费太长时间)
  • 在新价格出现的情况下将所有人锁定在系统中一段时间​​。

有人可以提供建议吗?是保持数据库连接打开更长时间的情况吗?

提前致谢!

更新 以下是瓶颈的完整代码: -

using (TransactionScope transaction = new TransactionScope())
{
    db.Database.ExecuteSqlCommand("UPDATE [MyDatabase].[dbo].[ProductVariationPrice] SET IsVisible = IsVisible ^ 1");
    transaction.Complete();
}

List<ProductVariationPrice> oldProductPrices = db.ProductVariationPrices.Where(x => !x.IsVisible).ToList();
db.ProductVariationPrices.RemoveRange(oldProductPrices);
db.SaveChanges();

1 个答案:

答案 0 :(得分:0)

改变你的方法。您不需要删除记录,然后再次插入记录。插入操作的成本不低于更新(实际上它取决于多个因素)。从C#代码更新记录的已经被禁止的想法是可怕的。相反,这样做:

Import the CSV file to additional, working table in the database.

不要忘记添加主键。如果您不需要事务登录更新,请使用TRUNCATE,或者只是DROP并重新创建工作表。这将比DELETE行快得多。另请考虑使用TEMPORARY表。

Write a query to update the records in the original table by joining the records in the working/TEMPORARY table you just imported.

就是这样。

当然,您可以根据自己的情况使用IsVisible旗帜,但我认为不再需要它了。