2009-11-25 4 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 

я что-нибудь не хватает? Если нет, есть ли другой пакет, который я могу использовать, это потокобезопасный?

Редактировать: с помощью SQLite3.4 на Mac OS 10.5.

ответ

0

После некоторого расследования я обнаружил, что проблема не имеет ничего общего с sqlite3.

В функции, выполняющей поточный доступ к БД, возникает исключение. Поскольку значение Thread.abort_on_exception defaults равно false, исключение маскируется, но проявляется как ошибка шины (см. Выше), как только функция 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

+0

Хмм интересно, что исходный компилятор, но не ссылается на эту функцию (хотя gcc находит библиотеку). Я чувствую запах библиотеки, устанавливающей синаниганы. – Justicle