【问题标题】:Multiple row insertion Azure Mobile Services Offline, sync with the backend多行插入 Azure 移动服务离线,与后端同步
【发布时间】:2015-08-22 18:20:16
【问题描述】:

是否可以修改 Azure 移动服务 .Net 后端中的表控制器以处理每个 http 请求的多插入? 重新上线后,我的应用需要 2 多分钟才能同步其数据。 2 分钟内超过 70% 的时间浪费在网络握手开销上。

【问题讨论】:

    标签: c# azure-mobile-services


    【解决方案1】:

    我不得不做类似的事情。每次用户创建新项目时,我的应用程序都会创建大约 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. 后想到了这个

    【讨论】:

    • 感谢分享,我的情况有点复杂,需要将数据插入localdb。用户可以进行离线数据操作,当它重新上线时,我需要从缓冲区中取出所有脏行并按顺序将它们批量推送到服务器(保持外键要求)。实现这部分的成本与完全实现离线同步一样昂贵。我在想也许有办法通过一些配置让 azure sdk 为我做这件事。
    • 好的,我明白你现在在说什么了。是的,似乎还没有办法通过配置来做到这一点。
    猜你喜欢
    • 1970-01-01
    • 2018-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-10
    • 2015-11-25
    • 1970-01-01
    相关资源
    最近更新 更多