将IndexedDB与Sql Server同步

时间:2014-03-12 05:35:53

标签: sql-server indexeddb

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

4 个答案:

答案 0 :(得分:7)

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

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

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

以下是您应该考虑的几件事:

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

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

答案 1 :(得分:3)

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

答案 2 :(得分:3)

根据我在您的问题中的理解,您只是在db完成时使用indexeddb,就像缓存层一样。我将做的是以下内容。

如果您在线工作,您的数据保存应该存在2个动作。保存到您的服务(SQL服务器)并保存到indexeddb。

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

答案 3 :(得分:2)

我们在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