2012-07-31 20 views
22

Używam GreenDAO do obsługi baz danych w systemie Android. Podczas wykonywania wielu zmian w bazie danych (> 15.000) otrzymuję ten błąd wiadomość:Pula połączeń nie mogła przydzielić połączenia z wątkiem

puli połączeń do bazy danych „/ data/data/...” nie był w stanie udzielić połączenia do gwintowania 312 (gwint-312) z flagami 0x1 przez 30.000002 sekund.

Wszystko utknie. Dlaczego ten błąd występuje?

+0

Podaj więcej informacji na ten temat. Na przykład. śledzenie stosu, czy występuje na wszystkich testowanych urządzeniach ?, testowane wersje Androida, ... –

+0

Mam ten sam problem. Nie ma śladu stosu, ten sam błąd pojawił się wielokrotnie i nie mogę już uzyskać dostępu do bazy danych. Zastanawiam się, czy gdzieś w GreenDao jest otwarta transakcja, ale nie koniec transakcji w klauzuli "ostatnia". – Hiep

Odpowiedz

8

Nie mogę powiedzieć na pewno o tej konkretnej implementacji, ale istnieje połączenie, które zwykle wspiera ORM. Pula połączeń otwiera określoną liczbę połączeń z bazą danych i przetwarza je podczas zamykania i otwierania nowych połączeń. To, co ci mówi, to fakt, że prawdopodobnie osiągnął limit. To może się zdarzyć z wielu różnych powodów, jednym jest to, że prawdopodobnie istnieje pewien zakleszczenie w DB, ponieważ aktualizujesz dwie tabele i dwie różne transakcje trzymają różne tabele czekając na wydanie drugiej. Lub po prostu, że istnieje zbyt wiele otwartych połączeń i DB lub puli połączeń po prostu mylić.

Przykro mi, że tak naprawdę nie jest to odpowiedź, ale będziesz musiał spojrzeć na dokumenty dla GreenDAO, aby zobaczyć, jak to się może stać.

+1

greenDAO nie korzysta z żadnych pul połączeń. Aplikacje z greenDAO zachowują się jak wiele aplikacji na Androida używających SQLite. Otrzymujesz SQLiteDatabase za pomocą jakiegoś SQLiteOpenHelper. Instancje DaoMaster/DaoSession odnoszą się do tego obiektu SQLiteDatabase. –

32

Mam tę wiadomość, gdy chcę wybrać zapytanie w tabeli, która jest używana w transakcji bez zakończonej transakcji wcześniej. Problem rozwiązany podczas wykonywania endTransaction() na końcu bloku transakcji.

+1

Należy również pomyśleć o tworzeniu partii podczas importowania dużych zestawów danych. Powiedz, zrób 'endTransaction()' i rozpocznij nową transakcję po n encjach. – melbic

0

Otrzymałem tę wiadomość podczas tworzenia zbyt wielu połączeń z SQLite za pośrednictwem DBFlow FlowQueryList. Moim rozwiązaniem było upewnienie się, że gdy skończysz z listą zapytań, zadzwonisz pod numer endTransactionAndNotify(), a następnie close() na liście zapytań.

Samo dzwonienie pod numer endTransactionAndNotify() nie rozwiązało problemu. Mam nadzieję, że to pomoże, ten wątek z pewnością mi pomógł.

Powiązane problemy