Поможет ли пул соединения с многопоточностью в sqlite (и как)? - PullRequest
0 голосов
/ 09 апреля 2010

В настоящее время я использую синглтон для доступа к моей базе данных (см. связанный вопрос ), но теперь, когда пытаюсь добавить некоторую фоновую обработку, все рушится. Я прочитал документацию по sqlite и обнаружил, что sqlite может работать с потоками, но каждый поток должен иметь свое собственное соединение с БД. Я пытаюсь использовать egodatabase , которая обещает упаковку sqlite с безопасностью потоков, но очень глючит, поэтому я возвращаюсь к своей старой библиотеке FMDB и начинаю видеть, как использовать ее в многопоточном режиме.

Поскольку у меня есть весь код с идеей синглтона, изменить все будет дорого (и многие соединения открытия / закрытия могут стать медленными), поэтому мне интересно, если, как подсказывают документы sqlite, создать пул для каждого соединения поможет. Если это так, как это сделать? Как узнать, какое соединение получить из пула (потому что 2 потока не могут совместно использовать соединение)?

Интересно, если кто-то уже использует sqlite в многопоточности с NSOperation или подобными вещами, мои поиски возвращают только "да, это возможно", но дайте подробности моему воображению ...

1 Ответ

0 голосов
/ 24 мая 2010

Вы должны посмотреть на использование локальных переменных потока для хранения соединения; если переменная пуста (то есть содержит что-то вроде NULL), вы знаете, что можете безопасно открыть соединение в этой точке, чтобы обслуживать поток и сохранить соединение обратно в переменной. Не знаю, как это сделать с Obj-C.

Также следует помнить, что SQLite не настроен для одновременной записи. Блокировки писателя стоят дорого, поэтому сохраняйте любое время в транзакции записи (т. Е. Той, которая включает INSERT, UPDATE или DELETE) до минимума во всех потоках. Транзакции также слишком дороги.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...