powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / SQLite [игнор отключен] [закрыт для гостей] / SQLite, c# и несколько потоков
7 сообщений из 7, страница 1 из 1
SQLite, c# и несколько потоков
    #36088204
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для обработки очереди порождаются несколько потоков, в каждом работает одна и та же функция, как в ThreadPool.
Эта функция делает следующее:

1. Lock очереди
2. Выбирает следюущий элемент из очереди
3. делает запрос в базу, если запись есть, что этот элемент обработан, тогда завершается
4. обрабатывает элемент
5. пишет в базу, что элемент обработан (чтобы эелемент обрабатывался только один раз)


Вопрос:

если база SQLite и если несколько параллельных потоков
будут читать писать в базу - не будет ли проблем?
...
Рейтинг: 0 / 0
SQLite, c# и несколько потоков
    #36088442
Фотография potkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Писать может только один поток. Когда он обработан можно делать следующую запись в БД. А вот читать могут несколько, правда у меня бывают исключения иногда даже при чтении. Одновременно писать и читать - больше исключений чем "нормальной" работы.
Так, что реально можно организовать одновременно несколько потоков только на чтение и то иногда будут исключения.
...
Рейтинг: 0 / 0
SQLite, c# и несколько потоков
    #36088520
MBG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBG
Гость
potkinПисать может только один поток. Когда он обработан можно делать следующую запись в БД. А вот читать могут несколько, правда у меня бывают исключения иногда даже при чтении. Одновременно писать и читать - больше исключений чем "нормальной" работы.
Так, что реально можно организовать одновременно несколько потоков только на чтение и то иногда будут исключения.

Читайте документацию, вместо того, чтобы вводить себя и других в заблуждение. Одновременно работать с БД могут множество потоков, каждый из которых может читать и/или модифицировать данные. В тот момент, когда один из потоков пишет в базу, остальные ожидают в очереди течении заданного таймаута; таким образом, работа множества потоков с одной базой происходит прозрачно для приложения. При чтении никаких блокировок не бывает, соответственно, именно для интенсивного многопоточного чтения эскулайт очень эффективен.

Для создания очереди запросов всего лишь следует указать лимит времени на пребывание запросов в очереди (по умолчанию 0 мс, т.е. очередь нулевой длины):
http://www.sqlite.org/c3ref/busy_timeout.html
...
Рейтинг: 0 / 0
SQLite, c# и несколько потоков
    #36089246
Фотография potkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MBGДля создания очереди запросов всего лишь следует указать лимит времени на пребывание запросов в очереди (по умолчанию 0 мс, т.е. очередь нулевой длины):

Да, этого не знал...

авторПри чтении никаких блокировок не бывает...

Для 20-30 одновременных Селектов может быть блокировка, по крайней мере у меня из 10 раз одна блокировка бывает.
...
Рейтинг: 0 / 0
SQLite, c# и несколько потоков
    #36089819
MBG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBG
Гость
potkin
авторПри чтении никаких блокировок не бывает...

Для 20-30 одновременных Селектов может быть блокировка, по крайней мере у меня из 10 раз одна блокировка бывает.

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

У меня для сотни одновременных запросов все в порядке (использую собственную сборку, деб-пакеты есть в моем репозитории - увеличены кэши, оптимизирован размер страницы для ФС ext3, добавлено более десятка расширений, в т.ч. быстрая реализация модуля поддержки юникода).
...
Рейтинг: 0 / 0
SQLite, c# и несколько потоков
    #36092173
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у меня шарп и нет провайдер.

на чтение из нескольких потоков проблем не получил, но на запись время от времени получаю типа мемори корруптед и т.д

Пришлось переделать запись на использование отдельного одного потока и очереди.
Т.е. несколько рабочих потоков вкидывают в очередь элементы для записи в базу, а
один пишет.
...
Рейтинг: 0 / 0
SQLite, c# и несколько потоков
    #36092337
MBG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBG
Гость
Winnipuhу меня шарп и нет провайдер.

на чтение из нескольких потоков проблем не получил, но на запись время от времени получаю типа мемори корруптед и т.д

Пришлось переделать запись на использование отдельного одного потока и очереди.
Т.е. несколько рабочих потоков вкидывают в очередь элементы для записи в базу, а
один пишет.

Кривой враппер, перепишите. Как пример, можете посмотреть tcl-sqlite и на его основе написать свой для шарпа. Или на офсайте посмотрите. Сам виндой не пользуюсь, так что подробнее не подскажу (имхо удобнее писать на чистом С и пользоваться кросс-компиляцией).
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / SQLite [игнор отключен] [закрыт для гостей] / SQLite, c# и несколько потоков
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]