从Web worker和主浏览器线程访问相同的Web sql数据库

时间:2012-02-13 18:11:16

标签: javascript html5 web-sql

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

我正在使用async api,因为我相信这是为web worker和主ui​​线程实现的唯一API。

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

有没有人这样做过?

3 个答案:

答案 0 :(得分:1)

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

编辑:

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

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

答案 1 :(得分:0)

查看SQLite FAQ,有一个Is SQLite threadsafe?问题引用了SQLITE_THREADSAFE编译时选项。请参阅Compilation Options For SQLite

然后,在core functionsSQL As Understood By SQLite部分,有一个sqlite_compileoption_get(N)功能:

  

sqlite_compileoption_get()SQL函数是一个包装器   sqlite3_compileoption_get()C / C ++函数。这个例程返回   用于构建SQLite的第N个编译时选项,如果N不在,则为NULL   范围。另请参见compile_options pragma。

我认为您可以编写SQLite语句并从JavaScript调用以查看PRAGMA compile_options;的设置方式。

答案 2 :(得分:0)

在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)});
});