【问题标题】:Syncing IndexedDB with Sql Server将 IndexedDB 与 Sql Server 同步
【发布时间】:2014-04-16 01:47:51
【问题描述】:

我正在使用 HTML5 IndexedDB 概念在我的页面中进行离线数据库连接。但最初,我想获取大数据以将其存储在我的 IndexedDb 中,因此为此目的,我正在尝试将 Sql Server 数据同步到我的 IndexedDb数据库,但我没有找到任何解决方案。有没有办法做到这一点,如果有,请帮助我..谢谢..

【问题讨论】:

    标签: sql-server indexeddb


    【解决方案1】:

    我们在 HTML5 和 IndexedDB 数据库上实现了 crud 操作,以提供离线支持。下一步是同步离线和在线数据库。在本文中,我们将使用 ASP.NET Web API 实现 IndexedDB 和 SQL Server 数据库的同步。

    从服务器数据库同步本地数据库:

    $('#btnSyncLocal').click(function () {
        $.ajax({
            url: 'api/service?revision=' + localStorage.customerRevision,
            type: 'GET',
            dataType: 'json',
            success: function (data) {
                if (data.Revision == localStorage.customerRevision) {
                    alert('You are already working on the latest version.');
                }
                else {
                    syncData(data);
                }
            }
        });
    });
    

    从本地数据库同步服务器数据库:

    $('#btnSyncServer').click(function () {
        var customers = [];
        db.linq.from(config.objectStoreName).select().then(function () {
            if (customers.length > 0) {
                var postData = { revision: parseInt(localStorage.customerRevision, 10), appID: config.appID, customers: customers };
                $.ajax({
                    url: 'api/service',
                    type: 'POST',
                    dataType: 'json',
                    contentType: "application/json",
                    data: JSON.stringify(postData),
                    success: function (data) {
                        if (data.Revision == localStorage.customerRevision) {
                            alert('There is newer version on the server. Please Sync from server first.');
                        }
                        else {
                            syncData(data);
                        }
                    }
                });
            }
            else {
                alert('There is no change in data after your last synchronization.');
            }
        }, handleError, function (data) {
            if (data.Revision == -1) {
                customers.push(data);
            }
        });
    });
    

    有关此示例的完整实现,请参阅此链接:

    这里有一个示例实现: Syncing Offline Database (HTML5 IndexedDB) with Online Database using Asp.Net Web API

    【讨论】:

    • 我将离线数据存储在 indexdb 中,但我想在用户上线时将该数据存储到我的远程数据库中,请告诉我该怎么做...?
    【解决方案2】:

    除了EditorKristof 的答案之外,我还想补充一些东西,因为我已经研究过类似的解决方案。

    • 首先正如编辑所说,IndexedDB 是面向文档的数据库,而 SQL 是关系数据库,这意味着您应该在将数据存储在本地之前将其转换为对象模型
    • 避免在IndexedDB 中使用多个表并尝试创建连接。
    • 如果您在数据库中存储不同的对象或您的主要对象有其他数据(例如一个表中的文章列表 - 第二个表中的文章文本),则应使用 IndexedDB 中的其他表。

    接下来是data synchronization - 如果您更新双方(客户端和服务器)的数据,这会变得非常复杂。您在数据同步中将面临的主要问题是您将拥有一个主要的SQL 数据库和许多本地客户端数据库。

    您还应该考虑以下几点:

    • 您需要选择何时进行同步或按客户端请求。
    • 另一个弹出的问题是:如果用户在脱机模式下工作很多时间并更新之前已被另一个用户删除并存储到SQL 数据库的对象怎么办。
    • 当然,当您同步数据时,将其拆分成块,这将减少每个响应的大小,IndexedDB 可以更快地处理较小的事务。
    • 我目前一次同步 500 个项目(根据您的对象大小进行调整)
    • 同样在Chrome 中,您可以从web-workers 访问IndexedDB 并发出并行请求 - 这确实可以加快处理速度。

    这只是您在开始实施解决方案之前需要考虑的一些事实,希望对您有所帮助。

    【讨论】:

    • 这里很重要。在服务器端更新存储似乎无害,但在同步方面会产生一些可怕的后果。
    • 嘿编辑我注意到你在 github 上关注我,我在那里读到你也住在纽约,我将在下个月的纽约 HTML5 聚会上发表关于客户端存储技术的演讲 - meetup.com/html5-app-developers/events/170965392 - 如果可以的话,加入吧。认识其他使用索引数据库的人会很酷。
    • 事实上,我一直在尝试联系。我会在那里。
    • 是的,我也是,我在互联网上到处使用相同的用户名,所以请在 twitter 或 gmail 上给我写信。
    • 我将离线数据存储在 indexdb 中,但我想在用户上线时将该数据存储到我的远程数据库中,请告诉我该怎么做...?
    【解决方案3】:

    根据我对您问题的理解,您只是在使用 indexeddb 作为缓存层,以防数据库完成。我要做的是以下。

    如果您在线工作,则应在 2 次操作后保存您的数据。保存到您的服务(SQL 服务器)并保存到您的 indexeddb。

    如果您离线,我会进行 2 次操作。 On 仍在更新您的 indexeddb,但我会添加一个额外的对象存储,您可以在其中保存所有必须在您的服务上执行的操作。重新上线后,您可以一一处理。

    【讨论】:

    • 我第一次使用 IndexedDB 从 SQL Server 填充并将其保存在我的 indexedDB 中...我的 SQL Server 中的数据不会重复更改,它几乎相同,或者可能很少发生一些更改..所以,我几乎将只使用我的 IndexedDB 数据离线工作.. 但是,我无法将 SQL 数据保存到我的 IndexedDB.. 就目前而言,我已经插入了一些虚拟数据,这些数据也是硬编码的..我想自动化将 SQL Server 数据复制到我的 IndexedDB 的过程..
    • 那么你保存在indexeddb中的数据是直接来自SQL服务器的,不允许用户自己保存?这将使它容易得多。我认为最好的办法是将您的数据从 SQL 服务器公开为一项休息服务。接下来你将不得不一个一个地插入数据,没有批量插入的可能性。我建议使用一项事务来插入您的数据。但是为了解决您的问题,您是否需要一个如何插入数据的代码示例?
    • 现在,我已经创建了一个示例 HTML 文件并手动插入了我的表的数据。一切正常,但不是手动插入数据,我想让它更容易。
    • 另外,我还有一个问题,现在,我创建了一个 HTML 文件,它工作正常。但是当我尝试将它添加到我的 .NET 项目中并运行它时,它向我抛出了错误消息 “Microsoft JScript 运行时错误:对象不支持属性或方法 'addEventListener'”。我是否遗漏了什么,或者我是否需要引用某些内容才能使其在我的 .NET 应用程序中工作
    • 关于您的第一条评论:我认为最好的办法是使用 REST 服务公开您的数据。在 .NET 世界中,您可以使用 ASP.NET MVC Web API。关于你的第二条评论。您在哪个对象上得到错误?使用 indexeddb 最简单的方法是使用 js promise。这使得回调更容易一些
    【解决方案4】:

    SQL 是关系型数据库。 IndexedDB 是一种索引键/值存储,类似于面向文档的数据库。没有开箱即用的方式将数据从各种 SQL 同步到 IndexedDB。您必须手动编写该代码(可能使用a Polyfill like this one 作为示例),但请注意inserting large amounts of data consecutively is not a good idea

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-03
      • 2010-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-15
      相关资源
      最近更新 更多