WCF客户端等待WCF服务器端通过EF读取大数据数据超时问题

garbun 2016-10-26 05:25:51
功能:服务器端MySql数据库数据对客户端Sqlite数据单向更新,目前先考虑1个客户端
服务器端数据库:MySQL
客户端数据库:Sqlite
ORM:EF
通信:WCF
数据库表:单表,50个字段(id, lastModitfyTime)

整体思路:
1- Client端将数据库数据转成字典Dictionary<id, lastModitfyTime>分批传给Server端(500条一批)
2- Server端将接受的Dictionary合并后与Server端数据逐一查找比较时间,返回有效数据的Dictionary(删除时间相同的数据,新数据时间设置为0)给Client端
3- Client端接受数据后根据Dictionary的id取数据,分批压缩传输回Server端
4- Server端接受数据后解压,插入以及更新数据库

客户端有6W条新数据,数据量太大,所以选择分批&压缩的方式传输数据。
在步骤2中 Server接受的Dictionary有6W条数据,Server本段端数据库有1000数据,我Server端使用以下的方法做数据比较.
代码里Client端通过Server 实例接口调用以下方法,因为数据量较多,程序一直等待在该函数执行完毕,并报客户端等待超时1min的错误.
我想咨询的是
1我能通过什么方法实现Client端代码告诉Server端进行数据比较后,Server端"独自地"完成该比较,Client能够知悉Server端完成了,而不会报等待超时错误,并执行后续操作.(隐约的感觉是否能使用并发或者委托,但不知道如何处理)
2我这样设计合理么,咨询过做PHP的朋友,他用MySql 语句的, 说有Replace方法,当数据存在即更新不存在即插入,EF怎么实现这个功能呢?

public Dictionary<long, DateTime> CheckedClientData(Dictionary<long, DateTime> dictionary)
{
var tempDic = dictionary.ToDictionary(keys=>keys.Key, values=>values.Value);
using (var db = new historyContext())
{
//修改
var queryResult = db.history.Select(x => x);
foreach (var id in dictionary.Keys)
{
var clientDataTimestamp = dictionary[id];
var result = queryResult.Select(x => x.id == id);
if (result.Count() > 0)
{
var data = queryResult.First();
if (data.lastRemoteUpdate < clientDataTimestamp)//
{
continue;
}
else
{
tempDic.Remove(id);
}

}
else
{
tempDic[id] = new DateTime(0);
}
}
}
return tempDic;
}
...全文
962 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
garbun 2016-10-26
  • 打赏
  • 举报
回复
再顶顶求求助
garbun 2016-10-26
  • 打赏
  • 举报
回复
还是没得人啊~
garbun 2016-10-26
  • 打赏
  • 举报
回复
自己先来顶一下

17,740

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET Framework
社区管理员
  • .NET Framework社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧