2013-10-24 3 views
1

Как мне иногда писать в базу данных sqlite с частыми читателями? Я использую PHP, но это не имеет большого значения. Я понимаю, что query() вернет SQLITE_BUSY, и я могу попробовать еще раз, и что я могу позвонить busyTimeout, но я надеюсь, что есть встроенный способ сообщить базе данных, чтобы она сама осталась. Сейчас я использую:Каков правильный способ реализации производителя/потребителя с SQLite3?

function wait_query_db($db, $query) { 
    do { 
     $db->busyTimeout(1000); 
     $result = @$db->query($query); 
    } while ($db->lastErrorCode() == SQLITE_BUSY); 
    return $result; 
} 
+0

Действительно, все DMS запускаются с параметрами, определенными DBA – Kyle

+1

Часто читатели или писатели? Потому что в SQLite у вас может быть теоретически неограниченное количество читателей. Ваша БД должна быть заблокирована во время записи, для записи –

+0

«Как мне иногда писать в базу данных sqlite с частыми читателями?» В принципе, записи нечасты, но может занять несколько минут, но чтение является частым и очень быстрым. – Andy

ответ

1

busyTimeout (или эквивалент PRAGMA busy_timeout) является встроенный способ сказать базу данных для Подождите.

Если вы хотите подождать дольше, вы должны использовать больший тайм-аут.

Если ваш PHP достаточно новый, что у вас есть хотя бы SQLite 3.7, и если ваша база данных не доступна через сетевую файловую систему, вам следует рассмотреть возможность включения write-ahead logging, что мешает читателям и писателям блокировать друг друга.

1

Нет встроенного способа. Увеличьте время ожидания загрузки. Вы можете установить его в самом соединении, выполнив:

PRAGMA busy_timeout = milliseconds 

(доступен с SQLite 3.7.15)

+0

Похоже, что 'PRAGMA busy_timeout = 1000;' такое же, как '$ db-> busyTimeout (1000);'. Если это так, тогда мне нужно будет только позвонить ему после открытия базы данных, верно? И может удалить его из моей петли? – Andy

+0

Вам нужно позвонить только один раз, независимо от того, какую форму вы используете. –

+0

Да, это то же самое, что вы, безусловно, можете удалить таймаут установки из цикла. – SqliteDog

Смежные вопросы