从web工作程序和主浏览器线程访问相同的websql数据库

accessing the same web sql database from a web worker and the main browser thread

本文关键字:websql 数据库 访问 线程 工作程序 web 浏览器      更新时间:2023-09-26

我已经在谷歌上搜索了很多,无法确定我是否应该能够从主ui线程和web工作者访问相同的websql数据库。

我正在使用asyncapi,因为我相信这是唯一一个为web工作者和主ui线程实现的api。

基本上,当两个线程对同一个数据库同时执行事务时,我会遇到问题。SQLite支持多个线程以可控的方式访问数据库,因此这应该是可能的。

有人这样做过吗?

Webworker的功能非常有限。您无法访问websql数据库或localStorage。唯一的解决办法是将消息发送到处理更新的主窗口。

编辑:

以下是可用webworker功能的链接:

https://developer.mozilla.org/en/DOM/Worker/Functions_available_to_workers

查看SQLite常见问题解答,有一个是SQLite线程安全吗?涉及SQLITE_THREADSAFE编译时选项的问题。请参见SQLite的编译选项。

然后,在SQLite理解的SQL的核心函数部分,有一个sqlite_compileoption_get(N)函数:

sqlite_compileoption_get()SQL函数是围绕sqlite3_compileoption_get()C/C++函数。此例程返回用于生成SQLite的第N个编译时选项,如果N超出,则为NULL范围另请参阅compile_options杂注。

我认为你可以写一个SQLite语句,并从你的JavaScript调用,看看PRAGMA compile_options如何;已设置。

在Chrome(29版测试)上,您现在可以访问webSql,只是不使用window

var db=window.openDatabase(....);

而是使用

var db=openDatabase(....);

此外,在调用executeSql时,请确保在第二个回调函数中记录错误消息。这有助于查看错误所在。

var db=openDatabase('myDB', '', 'my first database', 2 * 1024 * 1024);
db.transaction(function(tx){
   tx.executeSql('CREATE TABLE IF NOT EXISTS foo (id unique, text)',[],function(tx,results){
      self.postMessage("passed");
   },function(_trans,_error){self.postMessage(_error.message)});
   tx.executeSql('INSERT INTO foo (id, text) VALUES (1, "synergies")',[],function(tx,results){
      self.postMessage("passed");
   },function(_trans,_error){self.postMessage(_error.message)});
});