Thread View: pl.comp.lang.python
5 messages
5 total messages
Started by królewna
Thu, 18 Mar 2010 11:02
sqlite3, baza w pamięci i wielowątkowość
Author: królewna
Date: Thu, 18 Mar 2010 11:02
Date: Thu, 18 Mar 2010 11:02
24 lines
1982 bytes
1982 bytes
Mam problem, gdyż chciałabym użyć tablicy, która mieści się w pamięci
(definicja przez sqlite3.connect(":memory:") ) i nie wiem jak sprawić
aby ta sama baza była widziana w różnych wątkach. Jeśli chcę to samo
zrobić z bazą w pliku to nie ma problemu.
Nie mogę przekazać obiektu connection ani cursor gdyż wyskakuje mi
ProgrammingError: SQLite objects created in a thread can only be used in
that same thread.The object was created in thread id -1219066176 and
this is thread id -1224475792
jeśli natomiast otwieram różne połączenia to de facto podłączam się do
różnych baz. Czy w takim razie najlepszym rozwiązaniem jest napisanie
jakiegoś wrappera na dostęp do bazy? Nie ma prostszej metody?
U mnie jest jeszcze prosta sytuacja gdyż wątki są tworzone w ramach
jednego programu (więc można ewentualnie stowrzyć właśnie taki wrapper)
jednak co jeśli dwa oddzielne programy chciałyby mieć dostęp do tej
samej bazy sqlite rezydującej w pamięci? Należałoby wtedy stworzyć nowy
proces, który by tylko służył za pośrednika dostępu do bazy?
--
pozdrawiam
królewna
Re: sqlite3, baza w pamięci i wielowątkowość
Author: Piotr Husiatynski
Date: Thu, 18 Mar 2010 18:30
Date: Thu, 18 Mar 2010 18:30
28 lines
2346 bytes
2346 bytes
Dnia 18.03.2010 królewna <królewna@ee.pl> napisał/a:
> Mam problem, gdyż chciałabym użyć tablicy, która mieści się w pamięci
> (definicja przez sqlite3.connect(":memory:") ) i nie wiem jak sprawić
> aby ta sama baza była widziana w różnych wątkach. Jeśli chcę to samo
> zrobić z bazą w pliku to nie ma problemu.
>
> Nie mogę przekazać obiektu connection ani cursor gdyż wyskakuje mi
>
> ProgrammingError: SQLite objects created in a thread can only be used in
> that same thread.The object was created in thread id -1219066176 and
> this is thread id -1224475792
>
> jeśli natomiast otwieram różne połączenia to de facto podłączam się do
> różnych baz. Czy w takim razie najlepszym rozwiązaniem jest napisanie
> jakiegoś wrappera na dostęp do bazy? Nie ma prostszej metody?
>
> U mnie jest jeszcze prosta sytuacja gdyż wątki są tworzone w ramach
> jednego programu (więc można ewentualnie stowrzyć właśnie taki wrapper)
> jednak co jeśli dwa oddzielne programy chciałyby mieć dostęp do tej
> samej bazy sqlite rezydującej w pamięci? Należałoby wtedy stworzyć nowy
> proces, który by tylko służył za pośrednika dostępu do bazy?
SQLite jest na tyle "inteligentne", żeby nie pozwolić na ściganie się wątków w
zapisie do bazy. Rozwiązanie jest takie, żeby robić to tylko z głównego wątku.
Dlaczego wątki w pythonie?
--
Piotr Husiatyński
Re: sqlite3, baza w pamięci i wielowątkowość
Author: królewna
Date: Fri, 19 Mar 2010 10:51
Date: Fri, 19 Mar 2010 10:51
31 lines
2222 bytes
2222 bytes
W dniu 18.03.2010 19:30, Piotr Husiatynski pisze:
>
> SQLite jest na tyle "inteligentne", żeby nie pozwolić na ściganie się wątków w
> zapisie do bazy. Rozwiązanie jest takie, żeby robić to tylko z głównego wątku.
Więc jak mam rozumieć deklarację:
http://www.sqlite.org/faq.html#q5
Nie chodzi o zapis do bazy. Chodzi o jakiekolwiek odniesienie do bazy.
Nie mogę przesłać do wątku ani połączenia do bazy ani kursora na tej
bazie. Po prostu nie mogę przesłać do wątku żadnego obiektu klasy
sqlite3.* Jak już wspominałam to nie byłoby problemem gdybym mogła w tym
wątku podłączyć się do tej samej bazy ale polecenie
sqlite3.connect(":memory:") podłącza mnie do zupełnie innej bazy w
pamięci (problem ten nie występuję jeśli podłączam się do bazy w pliku).
A więc:
1. Mogę stworzyć tylko jedno połączenie do bazy w pamięci (bo inne będą
się odnosić do innych baz)
2. Nie mogę przesłać żadnych referencji do tej bazy poza wątek, w którym
stworzyłam połączenie.
Jeśli ktoś rozwiąże choć jedną przeszkodę to rozwiąże mój problem.
> Dlaczego wątki w pythonie?
Bo nadają się idealnie do tego co robię.
--
pozdrawiam
królewna
Re: sqlite3, baza w pamięci i wielowątkowość
Author: Bart Ogryczak
Date: Fri, 19 Mar 2010 13:45
Date: Fri, 19 Mar 2010 13:45
19 lines
2327 bytes
2327 bytes
On Mar 19, 11:51 am, królewna <króle...@ee.pl> wrote:
> W dniu 18.03.2010 19:30, Piotr Husiatynski pisze:
>
>
>
> > SQLite jest na tyle "inteligentne", żeby nie pozwolić na ściganie się wątków w
> > zapisie do bazy. Rozwiązanie jest takie, żeby robić to tylko z głównego wątku.
>
> Więc jak mam rozumieć deklarację:http://www.sqlite.org/faq.html#q5
>
> Nie chodzi o zapis do bazy. Chodzi o jakiekolwiek odniesienie do bazy.
> Nie mogę przesłać do wątku ani połączenia do bazy ani kursora na tej
> bazie. Po prostu nie mogę przesłać do wątku żadnego obiektu klasy
> sqlite3.* Jak już wspominałam to nie byłoby problemem gdybym mogła w tym
> wątku podłączyć się do tej samej bazy ale polecenie
> sqlite3.connect(":memory:") podłącza mnie do zupełnie innej bazy w
> pamięci (problem ten nie występuję jeśli podłączam się do bazy w pliku).
Zrób bazę na tmpfs i po problemie.
Re: sqlite3, baza w pamięci i wielowątkowość
Author: królewna
Date: Fri, 19 Mar 2010 13:53
Date: Fri, 19 Mar 2010 13:53
16 lines
1561 bytes
1561 bytes
ZNALAZŁAM!!!
Cała sztuczka sprowadza się do dodania nazwanego parametru w
połączeniu. Wystarczy dać:
sqlite3.connection(":memory:", check_same_thread = False)
a błąd zniknie i można przekazać połączenie do innego wątku i stworzyć
kursor. Od tej pory jednak jesteśmy zdani na siebie jeśli chodzi o
kontrolę dostępu do bd.
Jestem naładowana pozytywną energią na cały nadchodzący weekend :D
--
pozdrawiam
królewna
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads