我们的一位客户拥有一个网店,可以与他们的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和stock,将结果与XML进行比较,然后只更新数据库中库存的产品。 t匹配XML文件中的库存。
我的问题是将XML与数据库结果进行比较的最快方法是什么?将XML读入内存,从数据库循环结果集,然后在XML上使用XPath从每个产品获取库存值?首先将XML转换为字典,然后将其用于查找?
提前感谢您的帮助。
答案 0 :(得分:1)
避免不必要的文件导入的一种方法是从文件生成哈希码。在下次再次生成哈希代码并将其与旧代码进行比较之前导入之前,如果它们相同则不导入任何内容。
using(var stream = File.OpenRead("C:\\temp\\file.xml"))
using(var sha = new SHA1Managed())
{
var hashCode = sha.ComputeHash(stream);
}
如果散列不匹配,请将数据库读入字典,并在解析XML文件时将其与之进行比较。相应地更新数据库。您甚至可以更新字典并将其保存(可能在静态变量中),以便下次需要导入时,这样就可以避免必须始终从数据库中填充它。
答案 1 :(得分:1)
为什么你认为从数据库中读取,然后写入,会比直接写入更快?不要从数据库中进行SELECT,不需要将数据从数据库服务器传输到Web或应用程序服务器。
对于XML中的每个产品项,只需执行
即可UPDATE tablename SET stock = @stock WHERE productID = @productID AND stock <> @stock
要提高性能,请不要为每一行启动事务,而是对它们进行批处理,例如每个事务10次更新。无论如何,您不必担心可恢复性。如果发生崩溃,只需从头开始处理整个文件。
在输入端,读取XML的最快方法是使用XmlReader读取它,并在读取时执行数据库更新。在开始更新数据库之前,请不要将整个XML读入内存。