|
SQLite. WAL. Многопоточность
|
|||
---|---|---|---|
#18+
Есть несколько файлов БД. Есть много читающих, и поменьше пишущих потоков. Есть одна основная база, к которой ATTACHE'м подключены все остальные. Приложение, таким образом, использует подключение только к основной базе. Во всех базах: PRAGMA journal_mode = WAL; PRAGMA wal_autocheckpoint = 250; Наблюдается непрекращающийся рост WAL файлов. Меня это не устраивает, в идеале, лог добивается до небольшого значения, и сбрасывается в базу. Гугление принесло обсуждение подобной http://www.mail-archive.com/sqlite-users@sqlite.org/msg56074.html]проблемы в интернетах, но не принесло её решения. Внимание, вопрос - сталкивался ли кто-либо, и, если да, как победил? Благодарю за внимание. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2011, 18:07 |
|
SQLite. WAL. Многопоточность
|
|||
---|---|---|---|
#18+
rovan, Если WAL лог непрерывно растет, это лишь означает, что невозможно выполнить операцию переноса данных из лога в файл БД. Вероятно, база все время используется читающими потоками и/или производится модификация без закрытия транзакции. Если создать одну бесконечную транзакцию и модифицировать в ней БД, разумеется, WAL лог будет расти неограниченно. Вообще говоря, во всех СУБД подобное проектирование приложения приводит к проблемам. Выходов собственно два - использовать короткие транзакции или создавать отдельный поток для модификации данных (в последнем случае все равно нужно коммитить транзакции, а не держать вечно открытую транзакцию!). Можно вручную вызывать операцию сжатия WAL-лога, см. http://www.sqlite.org/pragma.html#pragma_wal_checkpoint ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2011, 23:51 |
|
SQLite. WAL. Многопоточность
|
|||
---|---|---|---|
#18+
MBG, благодарю. То есть, wal растёт из-за невозможности сбросить данные. Еще немного конретики: 1. Используются короткие транзакции. 2. Пробовал запускать вручную wal_checkpoint, сразу после комита транзакций - результат не изменился. Я верно понимаю, что проблема, скорее всего, в том, что в процессе проведения чекпоинта кто-то активно читает базу? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2011, 08:54 |
|
SQLite. WAL. Многопоточность
|
|||
---|---|---|---|
#18+
rovan, Попробуйте вызвать wal_checkpoint с аргументом: Код: plaintext 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2011, 13:52 |
|
SQLite. WAL. Многопоточность
|
|||
---|---|---|---|
#18+
Пробовал, не помогает. Придётся отказаться от WAL, до тех пор, пока не решу проблему с пишущими потоками. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.10.2011, 16:55 |
|
SQLite. WAL. Многопоточность
|
|||
---|---|---|---|
#18+
rovanПробовал, не помогает. Придётся отказаться от WAL, до тех пор, пока не решу проблему с пишущими потоками. Попробуйте вообще отключить транзакции и проверить. А потом добавляйте транзакции по очереди и смотрите, где проблема возникает. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.10.2011, 14:09 |
|
SQLite. WAL. Многопоточность
|
|||
---|---|---|---|
#18+
Вот из рассылки SQLite подробное описание, в каких случаях и почему WAL журнал может расти неограниченно: sqlite-users> Also, can you confirm I understand the following correctly: > 3) When using SQLITE_CHECKPOINT_PASSIVE, the WAL file will grow as needed, indefinitely, without ever shrinking. It is possible. But we hope it's the exception, not the rule. If a checkpoint runs and copies all WAL data into the database file, the next writer starts writing into the start of the WAL file again. The WAL file is not usually truncated (see PRAGMA journal_size_limit if you want it to be) here. The reason being that it is faster to overwrite an existing file than it is to truncate one and then start appending to it. So, if all goes well, SQLite should start over at the start of the WAL file after each checkpoint. Preventing the WAL file from growing indefinitely. There are two things that can go wrong: * A reader might prevent a checkpointer from copying all data from the WAL into the database file, or * While the checkpoint is underway, some other process may be writing to the database (appending to the WAL file). If either of the above occur, then the next writer will append to the WAL file, instead of writing into the start of it. If this happens every checkpoint, then the WAL file will grow without bound. Use CHECKPOINT_FULL or CHECKPOINT_RESTART (respectively) to prevent the two conditions enumerated above. Отсюда понятно, когда нужно использовать CHECKPOINT_FULL и CHECKPOINT_RESTART... соответственно, попробовав оба варианта, можно установить, читающие или пишущие потоки нам "мешают". ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2011, 07:51 |
|
|
start [/forum/topic.php?fid=54&msg=37458148&tid=2009109]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
165ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
40ms |
get tp. blocked users: |
1ms |
others: | 276ms |
total: | 522ms |
0 / 0 |