我已经搜索了很多内容,无法确定我是否应该能够从主ui线程和Web工作者访问相同的websql数据库。
我正在使用async api,因为我相信这是为web worker和主ui线程实现的唯一API。
基本上,当两个线程同时针对同一个数据库执行事务时,我会遇到问题。 SQLite支持以受控方式访问数据库的多个线程,因此它应该是可能的。
有没有人这样做过?
答案 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 functions的SQL 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)});
});