Форум сайта python.su
Подскажите как работать с базой в несколько потоков? Запросы будут SELECT, INSERT, UPDATE. Нужно ли использовать мьютексы? И сколько делать коннектов? Один общий на все потоки, один на запрос или один на поток?
Офлайн
Неплохо написано по данному вопросу:
http://books.google.com/books?id=VsZ5bUh0XAkC&lpg=PA246&ots=u4bNms55C7&dq=sqlite%20few%20connections&pg=PA250#v=onepage&q=sqlite%20few%20connections&f=false
http://stackoverflow.com/questions/355327/does-thread-safety-of-sqlite3-mean-different-threads-can-modify-the-same-table-of
http://stackoverflow.com/questions/524797/python-sqlite-and-threading
Вообще надо помнить, что писать одновременно в таблицу не получится. В общем случае, я бы делал по конекту на поток.
Но много людей советуют не использовать SQLite в многопоточных приложениях.
Отредактировано (Март 1, 2011 13:55:04)
Офлайн
я использовал базу многопоточно, проблем не наблюдал.
Офлайн
Кажется, sqlite использует блокировки внутри себя. Не уверен на 100% - в код не смотрел, лень.
Офлайн
А вот у меня были проблемы. При большом количестве одновременных инсертов, база иногда (не стабильно) портилась. Притом это выяснялось только при попытке сделать выборку. Очень неприятно…
Поэтому лично я рекомендую изменять базу через лок.
P.S. Опыт двухлетней давности. Может что и изменилось.
Офлайн
ZZZСейчас, если не ошибаюсь, вся база данных блокируется при транзакциях. Помню, что все просили сделать лок на уровне таблиц а не всей базы данных.
При большом количестве одновременных инсертов, база иногда (не стабильно) портилась.
Отредактировано (Март 2, 2011 11:38:42)
Офлайн
Сделал общий коннект на поток. В конструкторе класса создаю коннект, в других методах использую execute. Не получилось, пишет, что объекта коннекта должен быть в том же потоке, что и запросы. Хотя вроде так оно и есть. Сделал коннект при каждом запросе, в один поток всё нормально, в несколько - ошибка base is locked, буду пробовать использовать мьютексы.
Офлайн
plusplusМожет поможет:
Сделал общий коннект на поток.
Офлайн
Вопрос ‘новичка’ не в тему(нет смысла создавать новую)…как получить список всех таблиц в базе?совсем отчаялся в поисках ответа!!прошу не быть равнодушными…спасибо!!
Офлайн
rustavelСтранно вы как-то искали. Официальный FAQ http://www.sqlite.org/faq.html#q7
Вопрос ‘новичка’ не в тему(нет смысла создавать новую)…как получить список всех таблиц в базе?совсем отчаялся в поисках ответа!!прошу не быть равнодушными…спасибо!!
Офлайн