我有以下情况:我正在构建一个虚拟网络应用程序,每分钟提取一次赔率,将所有事件,比赛,赔率等存储到数据库,然后更新用户界面。
我有这样的结构:体育> 活动> 匹配> 投注> 赔率我正在使用代码优先方法,并且我正在使用EF进行所有与DB相关的操作。
当我第一次运行我的应用程序并且我的数据库为空时,我收到的赔率为XML: ~16 sports,~145个事件,~675个匹配,~17100个赌注和放大器; ~72824赔率 。
问题出现了:如何及时保存所有这些实体?解析不是耗时的操作 - 0.2秒,但是当我尝试批量存储所有这些实体时,我面临内存问题,并且保存耗时超过1分钟,因此下一次奇数拉动被触发,这是噩梦。
我看到某个地方禁用Configuration.AutoDetectChangesEnabled
并在我插入的每100/1000条记录上重新创建我的上下文,但我不在那里。每个建议都将不胜感激。提前致谢
答案 0 :(得分:1)
当您插入大量(虽然不是那么大)数据时,请尝试使用SqlBulkCopy。您也可以尝试使用Table Value Parameter并将其传递给存储过程,但我不建议这种情况,因为TVP对1000以下的记录表现良好。SqlBulkCopy
超级易用,这是一个很大的优点
如果您需要对许多记录进行更新,您也可以使用SqlBulkCopy
,但只需使用技巧。创建一个临时表并使用SqlBulkCopy
将数据插入到临时表中,然后调用存储过程,该存储过程将从登台表中获取记录并更新目标表。我已经多次使用SqlBulkCopy
这两种情况并且效果很好。
此外,使用SqlBulkCopy
您也可以批量插入并向用户提供反馈,但是,在您的情况下,我认为您不需要这样做。但是,这种灵活性就在那里。
我可以只使用EF吗?
我没试过,但你可以尝试使用this库。
答案 1 :(得分:0)
我理解你的情况但是:
您所做的所有操作都取决于您的机器规格和 软件本身。
现在如果机器规格无法处理过程,那么现在是时候了 更改计划,以限制要插入的记录数 这一切都要完成。