1

我们的一位客户有一家网上商店,可以与他们的 ERP 系统同步。由于他们的仓库既为他们的网上商店服务,也为他们的实体商店提供服务,因此经常更新网上商店中每种产品的现有数量很重要,因为他们不想在网上商店中销售在网上商店中没有的产品。仓库。

目前通过以下方式解决此问题:
每五分钟就有一个 XML 文件从 ERP 系统发布到网上商店。该文件看起来像这样:

<products>
  <product>
    <productID>1</productID>
    <stock>20</stock>
  </product>
  <product>
    <productID>2</productID>
    <stock>3</stock>
  </product>
</products>

XML 包含数据库中的所有数千种产品,无论该产品的现有数量是否发生变化。根据 ERP 提供商的说法,将其减少到仅更改的产品不是一个选项,因此我们需要自己处理它。

然后,网上商店处理 XML 文件,并更新数据库中所有产品的现有数量,每次更新都有单独的交易。正如您可能理解的那样,这不必要地缓慢且资源繁重。该数据库包含数千种产品,大多数情况下,实际上没有或很少有产品真正改变了库存数量。

所以我的想法是,最好的方法是首先从数据库中为所有产品选择 productID 和库存,将结果与 XML 进行比较,然后只更新数据库中库存不匹配的产品XML 文件中的库存。

我的问题是将 XML 与数据库结果进行比较的最快方法是什么?将 XML 读入内存,循环访问数据库中的结果集,然后在 XML 上使用 XPath 来获取每个产品的库存值?首先将 XML 转换为字典,然后使用它进行查找?

提前感谢所有帮助。

4

2 回答 2

1

避免不必要的文件导入的一种方法是从文件生成哈希码。下次导入之前,再次生成哈希码并将其与旧的进行比较,如果它们相同,则不导入任何内容。

using(var stream = File.OpenRead("C:\\temp\\file.xml"))
using(var sha = new SHA1Managed())
{
    var hashCode = sha.ComputeHash(stream);
}

如果散列不匹配,则将数据库读入字典,并在解析 XML 文件时将其与它进行比较。相应地更新数据库。您甚至可以更新字典并将其保留(可能在静态变量中)以备下次需要导入时使用,这样您就不必一直从数据库中填充它。

于 2012-06-06T11:09:43.167 回答
1

为什么你认为从数据库中读取,可能接着写入,会比直接写入更快?不要从数据库中选择,不需要将数据从数据库服务器传输到您的 Web 或应用程序服务器。

对于 XML 中的每个产品项,只需执行

UPDATE tablename SET stock = @stock WHERE productID = @productID AND stock <> @stock

为了提高性能,不要为每一行启动一个事务,而是对它们进行批处理,例如每个事务 10 次更新。无论如何,您不必担心可恢复性。如果发生崩溃,只需从头开始再次处理整个文件。

在输入端,读取 XML 的最快方法是使用 XmlReader 读取它,并在读取时执行数据库更新。在开始更新数据库之前不要将整个 XML 读入内存。

于 2012-06-06T13:08:11.993 回答