Sqlite через сетевой ресурс

Кто-нибудь имеет реальный опыт работы с базой данных Sqlite на SMB-ресурсе в локальной сети (Windows или Linux)?

Из документации ясно, что это не самый быстрый способ поделиться базой данных Sqlite.

Очевидные предостережения в том, что это может быть медленно, и Sqlite поддерживает только один поток записи в БД за раз. Таким образом, вы становитесь намного менее одновременными, потому что ваши обновления БД теперь будут блокировать БД дольше (БД будет заблокирована, пока данные передаются по сети).

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

Что я должен остерегаться? Может ли это работать?

Я знаю, что это не то, для чего был разработан Sqlite, меня меньше интересует решение на основе Postgres/MySql/Sql Server, так как я стараюсь максимально облегчить работу моего приложения с минимальным количеством зависимостей.

Ссылки по теме:

Из списка рассылки sqlite, так что я думаю, что один большой вопрос - насколько ненадежны API блокировки файлов по SMB (windows или linux)

4 ответа

Решение

Мой опыт работы с файловыми базами данных (то есть с базами данных без процесса сервера баз данных), который насчитывает более двадцати лет, заключается в том, что если вы попытаетесь поделиться ими, они неизбежно будут в конечном итоге повреждены. Я настоятельно рекомендую вам снова взглянуть на MySQL.

И, пожалуйста, обратите внимание, я не выбираю SQLite - я использую его сам, но не как общую базу данных.

Вы просили о реальном опыте. Вот некоторые из них:

Блокировка SQLite является надежной, при условии, что базовая (сетевая) файловая система также надежна. Исторически это было плохое предположение. Последние операционные системы делают это намного лучше.

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

Вы получите меньше проблем в хорошей надежной сети с отключенной "базой данных" (кэширование файлов на уровне клиента) для базы данных.

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

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

с https://www.sqlite.org/whentouse.html

это также относится к любому типу файловых баз данных, таких как Microsoft Access

Другие вопросы по тегам