2012-07-31 14 views
22

Ich verwende GreenDAO für die Datenbankverarbeitung in Android. Bei vielen Datenbankänderungen (> 15.000) erhalte ich folgende Fehlermeldung:Der Verbindungspool konnte keine Verbindung zum Thread herstellen

Der Verbindungspool für die Datenbank '/ data/data/...' konnte keine Verbindung zu Thread 312 (Thread-312) mit Flags 0x1 für 30.000002 Sekunden.

Alles bleibt hängen. Warum passiert dieser Fehler?

+0

Bitte geben Sie weitere Informationen zu diesem Problem an. Z.B. Stack-Spuren, tritt es auf allen getesteten Geräten auf ?, Android-Versionen getestet, ... –

+0

Ich habe das gleiche Problem. Es gibt keinen Stack-Trace, derselbe Fehler ist wiederholt aufgetreten und ich kann nicht mehr auf die Datenbank zugreifen. Ich frage mich, ob es irgendwo in GreenDao eine offene Transaktion gibt, aber keine Transaktion in einer finally-Klausel. – Hiep

Antwort

8

Ich kann nicht sicher über diese bestimmte Implementierung sagen, aber es gibt einen Verbindungspool, der normalerweise ein ORM unterstützt. Der Verbindungspool öffnet eine festgelegte Anzahl von Verbindungen zur Datenbank und führt sie beim Schließen und beim Öffnen neuer Verbindungen wieder zurück. Was dieser Fehler Ihnen sagt ist, dass es wahrscheinlich ein Limit erreicht hat. Das kann aus einer Vielzahl von Gründen passieren, zum einen gibt es möglicherweise einen Deadlock in der DB, weil Sie zwei Tabellen aktualisieren und zwei unterschiedliche Transaktionen unterschiedliche Tabellen warten, die auf die Freigabe des anderen warten. Oder einfach, dass es einfach zu viele offene Verbindungen gibt und der DB oder Verbindungspool nur verwirrt wird.

Entschuldigung, das ist nicht wirklich eine Antwort, aber Sie müssen sich die Dokumente für GreenDAO anschauen, um zu sehen, wie dies passieren könnte.

+1

greenDAO verwendet selbst keine Verbindungspools. Apps mit greenDAO verhalten sich wie viele Android-Apps mit SQLite. Sie erhalten eine SQLiteDatabase mit einer Art von SQLiteOpenHelper. Instanzen von DaoMaster/DaoSession beziehen sich auf dieses SQLiteDatabase-Objekt. –

32

Ich habe diese Nachricht erhalten, wenn ich eine Abfrage für eine Tabelle auswählen möchte, die bei einer Transaktion ohne beendete Transaktion zuvor verwendet wird. Problem gelöst, wenn endTransaction() am endgültigen Block der Transaktion ausgeführt wird.

+1

Denken Sie auch daran, beim Importieren großer Datasets Stapel zu erstellen. Sagen wir, make 'endTransaction() 'und starte eine neue Transaktion nach n entities. – melbic

0

Ich habe diese Nachricht beim Erstellen zu viele Verbindungen zu SQLite über DBFlow FlowQueryList erhalten. Meine Lösung bestand darin, sicherzustellen, dass, sobald Sie mit der Abfrage-Liste beendet wurden, endTransactionAndNotify() und dann close() auf der Querylist aufrufen.

Aufruf endTransactionAndNotify() allein hat nicht den Trick gemacht. Ich hoffe das hilft, dieser Thread hat mir sicherlich geholfen.

Verwandte Themen