我有一个使用Microsoft Sync Framework 2.0跨WCF服务(IIS Hosted)的进程来同步SQL 2008 Standard数据库(服务器)和SQL CE 3.5(客户端)。一切都运行良好,直到一个用户开始接收OutOfMemory Exceptions。事实证明,该用户的数据集明显大于任何其他用户。
有问题的数据集是800,000行,从SSMS导出为CSV时的总大小为174MB。大多数用户都在20-30MB范围内,工作正常。
我正在使用DbServerSyncProvider和SqlCeClientSyncProvider。
我已经实现了其他文章中描述的批处理并发布,但无济于事。据我所知,DbServerSyncProvider中的批处理机制只是在一次拉取中检索的数据修订数量。即使锚的差异为1,我仍然会得到相同大小的数据集。
我在我的服务上使用transferMode =“Streamed”,我在IIS中托管时已经应用了Streamed的修复程序。
我尝试过maxReceivedMessageSize,首先从20MB到200MB再到2GB,最后到10GB,都没有成功。这是在服务器和客户端上完成的。
我的WCF跟踪日志显示了执行GetChanges,但从不在Process action下记录任何内容。
我已经了解了SqlSyncProvider,以及它如何允许按内存大小进行批处理。我找不到有关通过WCF服务使用它的更多信息,在我尝试使用它重写我的客户端和服务器之前,我想检查我是否是某个东西的白痴以及SqlSyncProvider是否可以解决我的问题,以及能够通过WCF服务进行传输。
提前致谢...
答案 0 :(得分:2)
内存不足很可能是由数据集序列化的方式引起的。
如果您想使用SqlSyncProvider重新编写,请在此链接上查看“特定于N-Tier的代码”部分:http://msdn.microsoft.com/en-us/library/dd918908.aspx#Y3096。这应该可以让您了解为SqlSyncProvider编写WCF服务组件。
您还可以查看示例SQL Server and SQL Compact N-Tier with WCF
如果您想保留现有的提供商,可以使用DatasetSurrogates。在这里查看示例:Sync Framework WCF-based Synchronization for Offline scenario – Using custom dataset serialization