【发布时间】:2014-04-16 01:47:51
【问题描述】:
我正在使用 HTML5 IndexedDB 概念在我的页面中进行离线数据库连接。但最初,我想获取大数据以将其存储在我的 IndexedDb 中,因此为此目的,我正在尝试将 Sql Server 数据同步到我的 IndexedDb数据库,但我没有找到任何解决方案。有没有办法做到这一点,如果有,请帮助我..谢谢..
【问题讨论】:
标签: sql-server indexeddb
我正在使用 HTML5 IndexedDB 概念在我的页面中进行离线数据库连接。但最初,我想获取大数据以将其存储在我的 IndexedDb 中,因此为此目的,我正在尝试将 Sql Server 数据同步到我的 IndexedDb数据库,但我没有找到任何解决方案。有没有办法做到这一点,如果有,请帮助我..谢谢..
【问题讨论】:
标签: sql-server indexeddb
我们在 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
【讨论】:
除了Editor 和Kristof 的答案之外,我还想补充一些东西,因为我已经研究过类似的解决方案。
IndexedDB 是面向文档的数据库,而 SQL 是关系数据库,这意味着您应该在将数据存储在本地之前将其转换为对象模型IndexedDB 中使用多个表并尝试创建连接。 IndexedDB 中的其他表。接下来是data synchronization - 如果您更新双方(客户端和服务器)的数据,这会变得非常复杂。您在数据同步中将面临的主要问题是您将拥有一个主要的SQL 数据库和许多本地客户端数据库。
您还应该考虑以下几点:
SQL 数据库的对象怎么办。 IndexedDB 可以更快地处理较小的事务。 Chrome 中,您可以从web-workers 访问IndexedDB 并发出并行请求 - 这确实可以加快处理速度。这只是您在开始实施解决方案之前需要考虑的一些事实,希望对您有所帮助。
【讨论】:
根据我对您问题的理解,您只是在使用 indexeddb 作为缓存层,以防数据库完成。我要做的是以下。
如果您在线工作,则应在 2 次操作后保存您的数据。保存到您的服务(SQL 服务器)并保存到您的 indexeddb。
如果您离线,我会进行 2 次操作。 On 仍在更新您的 indexeddb,但我会添加一个额外的对象存储,您可以在其中保存所有必须在您的服务上执行的操作。重新上线后,您可以一一处理。
【讨论】:
SQL 是关系型数据库。 IndexedDB 是一种索引键/值存储,类似于面向文档的数据库。没有开箱即用的方式将数据从各种 SQL 同步到 IndexedDB。您必须手动编写该代码(可能使用a Polyfill like this one 作为示例),但请注意inserting large amounts of data consecutively is not a good idea。
【讨论】: