рекомендации по использованию sqlite для очереди базы данных - PullRequest
3 голосов
/ 27 октября 2009

Я использую базу данных sqlite для очереди производителя-потребителя.

Один или несколько производителей вставляют по одной строке с новым автоинкрементным первичным ключом.

Есть один потребитель (реализован в Java, использует библиотеку sqlite-jdbc ), и я хочу, чтобы он прочитал пакет строк и удалил их. Кажется, мне нужны транзакции для этого, но попытка использовать SQLite с транзакциями, похоже, не работает правильно. Я обдумываю это?

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

 Connection conn;
 // assign here

 boolean success = false;
 try {
    // do stuff
    success = true;
 }
 finally
 {
    if (success)
       conn.commit();
    else
       conn.rollback();
 }

Ответы [ 2 ]

3 голосов
/ 27 октября 2009

См. этот след для ознакомления с обработкой транзакций в Java JDBC.

Что касается вашего варианта использования, я думаю, что вы должны использовать транзакции, особенно если потребитель сложен. Сложная часть всегда состоит в том, чтобы решить, когда ряд был израсходован, и когда он должен быть рассмотрен снова. Например, если у вас есть ошибка до того, как потребитель сможет выполнить свою работу, вам понадобится откат. Но если строка содержит недопустимые данные (например, текст в числовом поле), откат превратится в бесконечный цикл.

1 голос
/ 27 октября 2009

Обычно в SQLite существуют явные (неявные!) Транзакции. Так что вам, конечно, нужно что-то вроде «START TRANSACTION», возможно, это связано с вашей привязкой Java - но хорошие привязки - нет.

Таким образом, вы можете захотеть добавить необходимое начало транзакции (в вашей привязке может быть специальный метод).

...