【发布时间】:2015-08-22 18:20:16
【问题描述】:
是否可以修改 Azure 移动服务 .Net 后端中的表控制器以处理每个 http 请求的多插入? 重新上线后,我的应用需要 2 多分钟才能同步其数据。 2 分钟内超过 70% 的时间浪费在网络握手开销上。
【问题讨论】:
是否可以修改 Azure 移动服务 .Net 后端中的表控制器以处理每个 http 请求的多插入? 重新上线后,我的应用需要 2 多分钟才能同步其数据。 2 分钟内超过 70% 的时间浪费在网络握手开销上。
【问题讨论】:
我不得不做类似的事情。每次用户创建新项目时,我的应用程序都会创建大约 10,000 个新行,因此我在移动服务中创建了一个自定义控制器来接受这一点。插入 10,000 个实体后,我将它们全部拉回本地同步数据库。
我首先创建了一个自定义控制器。
public class BatchInsertController : ApiController
{
DbContext context;
protected override void Initialize(HttpControllerContext controllerContext)
{
base.Initialize(controllerContext);
this.context = new DbContext();
}
[HttpPost]
public async Task<bool> BatchInsert(List<Entity> entities)
{
try
{
this.context.Entities.AddRange(entities);
await this.context.SaveChangesAsync();
return true;
}
catch (System.Exception ex)
{
Trace.WriteLine("Error: " + ex);
return false;
}
}
}
然后我会从我的客户端代码中调用这个自定义控制器方法。
var entities = new List<Entity>();
// Add a bunch of entities to the list...
foreach (List<Entity> chunkedEntities in entities.ChunksOf(1000))
{
var response = await _client.InvokeApiAsync<List<Entity>, bool>("batchinsert", chunkedEntities);
}
我一次会有超过 10,000 条记录,因此我创建了一个扩展方法来分块列表并一次发送 1,000 条记录。
public static IEnumerable<IList<T>> ChunksOf<T>(this IEnumerable<T> sequence, int size)
{
List<T> chunk = new List<T>(size);
foreach (T element in sequence)
{
chunk.Add(element);
if (chunk.Count == size)
{
yield return chunk;
chunk = new List<T>(size);
}
}
if (chunk.Any())
{
yield return chunk;
}
}
之后,我只是在本地数据库上执行了 PullAsync()。我在阅读this article. 后想到了这个
【讨论】: