powered by simpleCommunicator - 2.0.38     © 2025 Programmizd 02
Форумы / SQLite [игнор отключен] [закрыт для гостей] / SQLite. WAL. Многопоточность
7 сообщений из 7, страница 1 из 1
SQLite. WAL. Многопоточность
    #37457789
rovan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть несколько файлов БД.
Есть много читающих, и поменьше пишущих потоков.
Есть одна основная база, к которой ATTACHE'м подключены все остальные.
Приложение, таким образом, использует подключение только к основной базе.

Во всех базах:
PRAGMA journal_mode = WAL;
PRAGMA wal_autocheckpoint = 250;

Наблюдается непрекращающийся рост WAL файлов. Меня это не устраивает, в идеале, лог добивается до небольшого значения, и сбрасывается в базу.
Гугление принесло обсуждение подобной http://www.mail-archive.com/sqlite-users@sqlite.org/msg56074.html]проблемы в интернетах, но не принесло её решения.

Внимание, вопрос - сталкивался ли кто-либо, и, если да, как победил?

Благодарю за внимание.
...
Рейтинг: 0 / 0
SQLite. WAL. Многопоточность
    #37458148
MBG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBG
Гость
rovan,

Если WAL лог непрерывно растет, это лишь означает, что невозможно выполнить операцию переноса данных из лога в файл БД. Вероятно, база все время используется читающими потоками и/или производится модификация без закрытия транзакции. Если создать одну бесконечную транзакцию и модифицировать в ней БД, разумеется, WAL лог будет расти неограниченно. Вообще говоря, во всех СУБД подобное проектирование приложения приводит к проблемам. Выходов собственно два - использовать короткие транзакции или создавать отдельный поток для модификации данных (в последнем случае все равно нужно коммитить транзакции, а не держать вечно открытую транзакцию!).

Можно вручную вызывать операцию сжатия WAL-лога, см. http://www.sqlite.org/pragma.html#pragma_wal_checkpoint
...
Рейтинг: 0 / 0
SQLite. WAL. Многопоточность
    #37458329
rovan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MBG, благодарю.
То есть, wal растёт из-за невозможности сбросить данные.
Еще немного конретики:
1. Используются короткие транзакции.
2. Пробовал запускать вручную wal_checkpoint, сразу после комита транзакций - результат не изменился.

Я верно понимаю, что проблема, скорее всего, в том, что в процессе проведения чекпоинта кто-то активно читает базу?
...
Рейтинг: 0 / 0
SQLite. WAL. Многопоточность
    #37463889
MBG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBG
Гость
rovan,

Попробуйте вызвать wal_checkpoint с аргументом:

Код: plaintext
1.
PRAGMA database.wal_checkpoint(FULL);
PRAGMA database.wal_checkpoint(RESTART);
...
Рейтинг: 0 / 0
SQLite. WAL. Многопоточность
    #37469662
rovan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пробовал, не помогает.
Придётся отказаться от WAL, до тех пор, пока не решу проблему с пишущими потоками.
...
Рейтинг: 0 / 0
SQLite. WAL. Многопоточность
    #37470872
MBG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBG
Гость
rovanПробовал, не помогает.
Придётся отказаться от WAL, до тех пор, пока не решу проблему с пишущими потоками.

Попробуйте вообще отключить транзакции и проверить. А потом добавляйте транзакции по очереди и смотрите, где проблема возникает.
...
Рейтинг: 0 / 0
SQLite. WAL. Многопоточность
    #37486033
MBG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBG
Гость
Вот из рассылки 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... соответственно, попробовав оба варианта, можно установить, читающие или пишущие потоки нам "мешают".
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / SQLite [игнор отключен] [закрыт для гостей] / SQLite. WAL. Многопоточность
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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