|
SQLite, c# и несколько потоков
|
|||
---|---|---|---|
#18+
Для обработки очереди порождаются несколько потоков, в каждом работает одна и та же функция, как в ThreadPool. Эта функция делает следующее: 1. Lock очереди 2. Выбирает следюущий элемент из очереди 3. делает запрос в базу, если запись есть, что этот элемент обработан, тогда завершается 4. обрабатывает элемент 5. пишет в базу, что элемент обработан (чтобы эелемент обрабатывался только один раз) Вопрос: если база SQLite и если несколько параллельных потоков будут читать писать в базу - не будет ли проблем? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.07.2009, 09:50 |
|
SQLite, c# и несколько потоков
|
|||
---|---|---|---|
#18+
Писать может только один поток. Когда он обработан можно делать следующую запись в БД. А вот читать могут несколько, правда у меня бывают исключения иногда даже при чтении. Одновременно писать и читать - больше исключений чем "нормальной" работы. Так, что реально можно организовать одновременно несколько потоков только на чтение и то иногда будут исключения. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.07.2009, 11:28 |
|
SQLite, c# и несколько потоков
|
|||
---|---|---|---|
#18+
potkinПисать может только один поток. Когда он обработан можно делать следующую запись в БД. А вот читать могут несколько, правда у меня бывают исключения иногда даже при чтении. Одновременно писать и читать - больше исключений чем "нормальной" работы. Так, что реально можно организовать одновременно несколько потоков только на чтение и то иногда будут исключения. Читайте документацию, вместо того, чтобы вводить себя и других в заблуждение. Одновременно работать с БД могут множество потоков, каждый из которых может читать и/или модифицировать данные. В тот момент, когда один из потоков пишет в базу, остальные ожидают в очереди течении заданного таймаута; таким образом, работа множества потоков с одной базой происходит прозрачно для приложения. При чтении никаких блокировок не бывает, соответственно, именно для интенсивного многопоточного чтения эскулайт очень эффективен. Для создания очереди запросов всего лишь следует указать лимит времени на пребывание запросов в очереди (по умолчанию 0 мс, т.е. очередь нулевой длины): http://www.sqlite.org/c3ref/busy_timeout.html ... |
|||
:
Нравится:
Не нравится:
|
|||
14.07.2009, 11:56 |
|
SQLite, c# и несколько потоков
|
|||
---|---|---|---|
#18+
MBGДля создания очереди запросов всего лишь следует указать лимит времени на пребывание запросов в очереди (по умолчанию 0 мс, т.е. очередь нулевой длины): Да, этого не знал... авторПри чтении никаких блокировок не бывает... Для 20-30 одновременных Селектов может быть блокировка, по крайней мере у меня из 10 раз одна блокировка бывает. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.07.2009, 15:58 |
|
SQLite, c# и несколько потоков
|
|||
---|---|---|---|
#18+
potkin авторПри чтении никаких блокировок не бывает... Для 20-30 одновременных Селектов может быть блокировка, по крайней мере у меня из 10 раз одна блокировка бывает. При чтении блокировок нет. Но проблемы могут появиться при многопоточном обращении к функциям работы с датами, в зависимости от их реализации в вашей операционной системе. К версии 3.5.7 (далее временами проявлялись регрессии, примерно до версии 3.6.11) подобные проблемы (по крайней мере, в линуксе) были устранены (см. ченджлог, в документации эти изменения не были отражены) - так что попробуйте обновить версию SQLite. У меня для сотни одновременных запросов все в порядке (использую собственную сборку, деб-пакеты есть в моем репозитории - увеличены кэши, оптимизирован размер страницы для ФС ext3, добавлено более десятка расширений, в т.ч. быстрая реализация модуля поддержки юникода). ... |
|||
:
Нравится:
Не нравится:
|
|||
14.07.2009, 19:57 |
|
SQLite, c# и несколько потоков
|
|||
---|---|---|---|
#18+
у меня шарп и нет провайдер. на чтение из нескольких потоков проблем не получил, но на запись время от времени получаю типа мемори корруптед и т.д Пришлось переделать запись на использование отдельного одного потока и очереди. Т.е. несколько рабочих потоков вкидывают в очередь элементы для записи в базу, а один пишет. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2009, 21:14 |
|
SQLite, c# и несколько потоков
|
|||
---|---|---|---|
#18+
Winnipuhу меня шарп и нет провайдер. на чтение из нескольких потоков проблем не получил, но на запись время от времени получаю типа мемори корруптед и т.д Пришлось переделать запись на использование отдельного одного потока и очереди. Т.е. несколько рабочих потоков вкидывают в очередь элементы для записи в базу, а один пишет. Кривой враппер, перепишите. Как пример, можете посмотреть tcl-sqlite и на его основе написать свой для шарпа. Или на офсайте посмотрите. Сам виндой не пользуюсь, так что подробнее не подскажу (имхо удобнее писать на чистом С и пользоваться кросс-компиляцией). ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2009, 02:12 |
|
|
start [/forum/topic.php?fid=54&msg=36092337&tid=2009442]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
70ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
2ms |
others: | 321ms |
total: | 497ms |
0 / 0 |