#c# #wpf #database #sqlite
#c# #wpf #База данных #sqlite
Вопрос:
Я создаю приложение C # WPF, которое принимает данные RS232 и сохраняет все данные во встроенной базе данных с относительно высокой скоростью (сотни в секунду). Приложение выполняет две вещи одновременно:
- возьмите данные RS232 и сохраните в базе данных
- вывод данных из базы данных.
Я рассматриваю SQLite, потому что моему приложению требуется встроенная база данных, а это однопользовательское приложение. Но хранение и построение графиков данных (это может быть хранение текущих данных и построение графиков вчерашних данных) требует одновременного чтения и записи в базу данных. Я слышал, что SQLite блокируется по одному запросу и не может обрабатывать несколько запросов одновременно. Это правда? Если да, то какая другая встроенная база данных поддерживает многократную запись?
Ответ №1:
Berkeley DB выполняет неблокирующую запись и имеет репутацию быстрой.
Очень интересно, что ее можно использовать как замену SQLite.
приложения, написанные с использованием API SQLite версии 3, могут переключаться на использование Oracle Berkeley DB без изменений кода, путем повторной привязки к библиотеке SQLite Berkeley DB. Поведение двух продуктов на уровне приложений идентично, но расширенные функции Berkeley DB обеспечивают приложениям SQLite повышенную производительность, параллелизм, масштабируемость и надежность.
Похоже, это вполне соответствовало бы всем требованиям.
Комментарии:
1. Не знал о замене drop-in. Спасибо!
Ответ №2:
Хорошо, несколько вещей.
Во-первых, да, SQLite потокобезопасен, хотя автор не в восторге от этого. Читайте об этом здесь: http://www.sqlite.org/faq.html#q6.
Во-вторых, вы упомянули «быстрый» как сотни вставок в секунду. SQLite может легко достигать 30 000 вставок в секунду, если вы оборачиваете все в транзакцию. Я говорю это не потому, что это действительно был ваш вопрос, а скорее потому, что знание этого может помочь вашему решению (поскольку это переопределяет то, что считается «быстрым»).
Комментарии:
1. Я уверен, что многократная запись невозможна в SQLite. Но означает ли «потокобезопасность», что в ней может быть по крайней мере одна запись и несколько операций чтения?
2. @KMC — Sqlite поддерживает транзакции, так что это ваше средство контроля параллелизма (что, я подозреваю, вы подразумеваете под безопасностью потоков). Sqlite потокобезопасен до тех пор, пока вы не используете общие подключения между потоками. Также обратите внимание, что этот Sqlite поддерживает блокировку только на уровне базы данных, эффективно ограничивая вас только одним пользователем записи по таймеру, независимо от количества подключений.
Ответ №3:
Проверьте RavenDB. http://www.ravendb.net / было бы довольно легко запустить с ней несколько тестов и посмотреть, справится ли она с вашими требованиями.