Какова скорость вашего приложения, если:
- Вы используете только одно соединение с БД для всех своих потоков;
- Вы защищаете доступ к соединению с БД с помощью глобальной критической секции.
Затем вы можете попробовать нашу статическую привязку Sqlite3 , которая была скомпилирована без мьютекса потока:
#define SQLITE_THREADSAFE 2
// assuming multi-thread safety is made by caller - in our framework, there is
// only one thread using the database connection at the same time, but there could
// be multiple database connection at the same time (previous was 0 could be unsafe)
#define SQLITE_OMIT_SHARED_CACHE 1
// no need of shared cache in a threadsafe calling model
Мы используем такую модель в нашей среде ORM mORMot, и,связан с четырьмя уровнями кэша:
- Кэш операторов для повторного использования операторов SQL и связанных параметров на лету;
- Глобальный кэш результатов JSON на уровне базы данных, который сбрасывается глобальнона любой INSERT / UPDATE;
- настроенный кэш записей на уровне CRUD / RESTful для указанных таблиц или записей на стороне сервера;
- настроенный кэш записей на уровне CRUD / RESTful для указанных таблиц илизаписи на стороне клиента.
Результирующая производительность совсем не плохая - она хорошо масштабируется при многопоточном доступе, даже с глобальным критическим разделом.Конечно, SQlite3 не был разработан для масштабирования так же хорошо, как Oracle!Но я использовал SQlite в реальных приложениях с большим количеством клиентов.Вы можете рассмотреть возможность использования FireBird , который имеет более сложную (и настроенную) архитектуру для клиент-сервер.
Что касается ускорения записи, вы можете сгруппировать записи в транзакцию, а затемэто будет намного быстрее. Это то, что я использую для ускорения записи , и вы можете расширить эту концепцию с помощью нескольких клиентов: на стороне сервера вы группируете свои записи в общую транзакцию, котораядолжен быть зафиксирован по истечении времени ожидания (например, одна секунда).
SQLite3 очень быстро для такого добавления (даже больше с подготовленным оператором INSERT со связанными параметрами), но медленно для отдельных добавлений, потому что он должензаблокировать весь файл с помощью низкоуровневого API, что чертовски медленно.Чтобы сделать его ACID, убедитесь, что коммит всегда обрабатывается.Фактически, другие механизмы DB достигают хорошей параллельной скорости с подобным процессом, скрытым в фоновом режиме.Ожидается, что метод записи по умолчанию в SQLite3 будет таким, чтобы обеспечить доступ к одному и тому же файлу из нескольких процессов, но в приложении «клиент-сервер» вы можете полагаться только на то, что вы будете единственным, кто имеет доступ кФайл базы данных SQLite3, поэтому он будет в безопасности.