соединение с базой данных sqlite / вопрос блокировки - PullRequest
5 голосов
/ 09 июля 2010

Folks Я реализую файловую очередь ( см. Мой предыдущий вопрос ) с использованием sqlite. У меня есть следующие темы, работающие в фоновом режиме:

  1. thread-1 для очистки структуры памяти в таблице «queue» (вставка в таблицу «queue»).
  2. thread-1 для чтения и «обработки» таблицы «queue» запускается каждые 5–10 секунд
  3. thread-3 - запускается очень редко и удаляет старые данные, которые больше не нужны, из таблицы "queue", а также работает в вакууме, поэтому размер файла базы данных остается небольшим.

Теперь мне хотелось бы, чтобы каждый поток получал любую необходимую ему блокировку (ожидание с таймаутом, если это возможно), а затем завершал транзакцию. Это нормально, если потоки не работают одновременно - важно то, что однажды начавшаяся транзакция не завершится сбоем из-за ошибок «блокировки», таких как «база данных заблокирована».

Я посмотрел на документацию по транзакциям , но, похоже, нет возможности "тайм-аута" (я использую JDBC). Можно ли установить большое время ожидания в соединении?

Одно решение (не опробованное), о котором я могу подумать, - это иметь пул соединений с максимум 1 соединением. Таким образом, одновременно может быть подключен только один поток, поэтому мы не должны видеть никаких ошибок блокировки. Есть ли лучшие способы?

Thanx!

1 Ответ

2 голосов
/ 10 июля 2010

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

-Дон

...