Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / SQLite [игнор отключен] [закрыт для гостей] / SQLite, c# и несколько потоков / 7 сообщений из 7, страница 1 из 1
14.07.2009, 09:50
    #36088204
Winnipuh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLite, c# и несколько потоков
Для обработки очереди порождаются несколько потоков, в каждом работает одна и та же функция, как в ThreadPool.
Эта функция делает следующее:

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


Вопрос:

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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