2009-11-25 82 views
1

sqlite3 Ruby gem線程安全嗎?我找不到任何文件說它是。Ruby 1.8.6,SQLite3線程安全

在我的實驗,訪問來自多個Ruby線程數據庫最終將導致以下錯誤:

/Library/Ruby/Gems/1.8/gems/sqlite3-ruby-1.2.5/lib/sqlite3/driver/native/driver.rb:84: [BUG] Bus Error 

有什麼我失蹤?如果沒有,是否有另一個我可以使用的包是線程安全的包?

編輯:在Mac OS 10.5上使用SQLite3.4。

回答

0

經過一番調查,我發現這個問題與sqlite3無關。

在執行對數據庫的線程訪問的函數中,發生異常。由於Thread.abort_on_exception defaults爲假,異常被屏蔽,但是一旦DL函數被驅動程序喚醒,就表現爲總線錯誤(參見上文).rb

修復異常(愚蠢的字符串/整數比較)導致期望工作行爲 - 和使用上述測試的確表明,SQLite的LIB與-DTHREADSAFE=1

說明我還有周圍的SQL查詢互斥建所推薦的文件 (見http://www.sqlite.org/cvstrac/wiki?p=MultiThreading),但這可能沒有必要使用Ruby 1.8的「綠色」線程。

3

這很可能取決於您正在使用的sqlite3庫。它可以在開啓或關閉線程安全的情況下進行編譯。 sqlite3_threadsafe()函數會告訴你,儘管我懷疑API沒有在Ruby綁定中公開。

下面的C程序會測試你

#include <sqlite3.h> 
#include <stdio.h> 

int main() 
{ 
    printf("Threadsafe: %d\n", sqlite3_threadsafe()); 
} 

gcc -o test test.c -lsqlite3 

編譯它,如果它打印一個非零數字,那麼它應該是線程安全的。

+0

謝謝你,我沒有想到直接測試c lib。 – Justicle 2009-11-25 22:25:41

+0

嗯有趣的源代碼編譯,但不鏈接到該功能(雖然gcc確實找到了庫)。我聞到庫安裝shenanigans。 – Justicle 2009-11-25 23:04:58