【发布时间】:2015-06-02 15:55:24
【问题描述】:
我知道这一定是直截了当的,但不知何故我无法理解它。
-- 场景--
我们使用的系统具有 WPF 前端,然后是 DB first 实体框架,然后是 SQL 2008R2 数据库。
我们拥有的大多数实体都是父子关系。没有孩子就不能存在父母,因此我们采用的存储过程
父数据和子数据列表,这里的子数据列表在使用 XML Serializer 序列化整个列表后作为 XML 传递。
在我们必须保存 500,000 条子记录之前,这一切都运行良好。 当我们尝试执行此操作时,XML 序列化程序无法抱怨内存不足。 然后我尝试分批发送 10,000 条子记录,它执行查询并保存数据,但原子性随后丢失,因为它只是一个像这样的 for 循环..
For Each batchList In groups.Split(10000)
Dim serializer As New XmlListSerializer(Of someObject)(batchList.ToList(), "Data")
Dim xml = serializer.ToXmlString
efContext.AddData(CType(addedParentId.Value, Short?), xml, "/Data/someObject")
Next
其中添加数据是映射到存储过程的函数导入。
-- 问题--
现在我的问题是,在保持操作的原子性处于活动状态的同时,将多个子记录添加到数据库中的正确方法是什么。
另外,上面提到的方式非常慢,对于半百万记录需要5分钟,无论如何这是不可接受的。
【问题讨论】:
-
您的问题似乎与 xml 序列化有关,而不是与将数据批处理到 ddbb 相关。事实上,除非您不调用 context.save,否则您不会点击 ddbb,这不是您的代码的一部分
-
是的,我同意这一点,xmlserializer 已经发布了动态程序集加载,这会导致问题,我想知道其他人在这种情况下会做什么,或者 xml 序列化是处理这种情况的最佳方式?
-
我认为将 batchList 转换为 Enumerable 类型 (AsEnumerable()) 可能会有所帮助。而且大多数时候我使用 Json 对象而不是 XML,因为它更轻
-
批处理列表是 IEnumerable,我还没有尝试过 json 反序列化.. 下一个会尝试.. 你有使用它处理大量集合的经验吗?
-
为什么不将数据存储为常规数据而不是 xml?这是业务要求吗?
标签: c# sql .net database xml-serialization