2013-04-20 2 views
0

Я работаю над приложением VB.NET. В соответствии с природой приложения один модуль должен каждый день контролировать базу данных (SQLite DB). Этот мониторинг выполняется с помощью простого оператора select, который выполняется для проверки данных по некоторым условиям. Другие модули выполняют операции выбора, вставки и обновления в том же SQLite DB. на операторах SQLite для одновременного выбора работают нормально, но мне сложно найти, почему это не позволяет Inset и Update. Я понимаю, что это блокировка на основе файлов, но все равно, чтобы это сделать? каждый модуль, фактически оператор открывает и закрывает соединение с БД. Я ограничил пользователя для запуска одного заявления за раз с помощью графического интерфейса.Проблема параллельных соединений SQLite

любая помощь будет оценена по достоинству.

ответ

0

Если ваш файл базы данных отсутствует в сети, вы можете разрешить определенное количество параллелизма чтения/записи, включив WAL mode.

Но, возможно, вам следует использовать только одно соединение и выполнить собственную синхронизацию для всех доступов к БД.

+0

Благодарим вас за ответ. Теперь я делаю все это в одном потоке (форме). даже если этот поток будет закрыт, будет открыт второй поток (ту же форму). И ДА, это не сетевой файл. Не знаете, как использовать режим WAL. Можете ли вы помочь мне с помощью куска кода в VB.NET. – SOAMad

0

Вы можете использовать какой-либо механизм блокировки, чтобы убедиться, что база данных работает в многопоточной ситуации. Поскольку ваше приложение является интенсивным для чтения в соответствии с тем, что вы сказали, вы можете рассмотреть использование ReaderWriterLock или ReaderWriterLockSlim. (обратитесь к here и here для получения более подробной информации)

Если у вас есть только одна база данных, то создание только одного экземпляра замка в порядке; если у вас более одной базы данных, каждому из них может быть назначена блокировка. Каждый раз, когда вы читаете или пишете, введите блокировку (EnterReadLock() для ReaderWriterLockSlim или AcquireReaderLock() для ReaderWriterLock), прежде чем что-то делать, и после того, как вы закончите блокировку. Обратите внимание, что вы можете поместить выход блокировки в предложение finally, чтобы вы не запустили его.

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

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