Как использовать SQLite одновременно в Java? Какая самая лучшая обертка для этой цели? - PullRequest
3 голосов
/ 27 апреля 2011

Прежде всего, я знаю, что SQLite, вероятно, не самая подходящая СУБД для высоких требований параллелизма, но использование СУБД клиент / сервер для меня не вариант, по крайней мере, сейчас.

Приложение, которое я кодирую, вероятно, будет генерировать довольно много запросов и обновлений из разных потоков. Они не будут действительно тяжелыми или сложными обновлениями, вероятно, небольшими и быстрыми для большинства из них, но действительно непредсказуемо параллельными, поскольку они зависят от информации, поступающей от клиентов в сети. Насколько я знаю, SQLite в настоящее время может поддерживать много одновременных операций чтения, но только обновление за раз. Когда он пишет, ему необходимо получить эксклюзивную блокировку и вернуть исключение, если написано что-то еще.

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

Это мой вопрос, как вы думаете, я должен это сделать? Какая обертка подходит для этого?

Заранее спасибо! :)

UPDATE:

О параллелизме SQLite, на их веб-странице говорится:

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

И

Несколько процессов могут иметь одинаковые База данных открыта одновременно. Несколько процессов могут делать ВЫБЕРИТЕ одновременно. Но только один Процесс может вносить изменения в база данных в любой момент времени, однако.

(...)

Когда SQLite пытается получить доступ к файлу который заблокирован другим процессом, поведение по умолчанию - возврат SQLITE_BUSY.

Надеюсь, это поможет:).

Ответы [ 2 ]

2 голосов
/ 27 апреля 2011

Это зависит от типа подхода, который вы применяете к дизайну вашей базы данных, но в основном сводится к тому, чтобы делать что-то в соответствии с тем, что предлагал Феми, объединяя каждый вызов в один синхронизированный (или иным образом заблокированный) метод.

public class DatabaseUpdater
{
    private static final Lock lock = new ReentrantLock();

    public static void doUpdate(DatabaseObject db) throws SQLException
    {
        lock.lock();

        try
        {
            db.doWork();
        }
        finally
        {
            lock.unlock();
        }
    }
}

Пока все, кто делает обновления, проходят через вышеуказанный вызов, он будет синхронизировать каждый вызов.

1 голос
/ 27 апреля 2011

Будет ли функция synchronized() делать то, что вы хотите? Я имею в виду, что несколько потоков заблокировали бы ожидание доступа к БД, но если вы достаточно осторожны, то должны делать то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...