2012-02-13 73 views
4

我GOOGLE了很多,不能找出我是否應該能夠從主UI線程和網絡工作者訪問相同的websql數據庫。從網絡工作者和主瀏覽器線程訪問相同的網絡sql數據庫

我使用的是異步api,因爲我相信這是web worker和主UI線程中唯一實現的API。

基本上,當兩個線程同時對同一個數據庫執行事務時,我會遇到問題。 SQLite支持以受控方式訪問數據庫的多線程,所以它應該是可能的。

有沒有人這樣做呢?

回答

1

Webworkers的功能非常有限。您無法訪問websql數據庫或localStorage。唯一的解決方法是將消息發送到處理更新的主窗口。

編輯:

下面是可用webworker功能的鏈接:

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

+0

這是不正確的。請參閱http://www.infoq.com/news/2010/02/Web-SQL-Database以及webkit實現中的鏈接。看起來像同步和異步api web sql數據庫支持已被添加到網絡工作者。 – paul 2012-02-14 22:07:46

+0

看起來你是對的。您知道這個谷歌組條目:https://groups.google.com/a/chromium.org/group/chromium-html5/browse_thread/thread/f3b0c9340696656d/76ae45d1e9cc41e7? – Alex 2012-02-14 22:27:44

+0

謝謝,錯過了那一個。我遇到的問題是沒有人似乎知道你可以安全地從2個線程訪問什麼。我已經證明了最新的Chrome瀏覽器和黑莓PlayBook瀏覽器,從主UI線程和工作線程訪問相同的SQLite數據庫是好的,直到2個交易重疊。我不確定這是Webkit問題還是sqlite問題?什麼本地存儲是線程安全的?我想我會問另一個問題。 ta – paul 2012-02-15 14:30:24

0

望着SQLite的常見問題,有一個Is SQLite threadsafe?疑問,是指SQLITE_THREADSAFE編譯時間選項。請參閱Compilation Options For SQLite

然後,在SQL As Understood By SQLitecore functions部,有一個sqlite_compileoption_get(N)功能:

的sqlite_compileoption_get()SQL函數是圍繞 sqlite3_compileoption_get()C/C++函數的包裝。如果N超出 範圍,此例程將返回用於構建SQLite的第N個編譯時選項的 或NULL。另請參閱compile_options雜注。

我想你可以寫一個SQLite語句並從你的JavaScript調用,看看如何設置PRAGMA compile_options;

0

在Chrome(版本29測試),您現在可以訪問的WebSQL,呼籲executeSql一定要當只是不使用window

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

改用

var db=openDatabase(....); 

而且在第二個回調函數中記錄錯誤消息。 這對查看錯誤的位置很有幫助。

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