2012-07-31 20 views
22

Sto utilizzando GreenDAO per la gestione del database in Android. Durante l'esecuzione di molte modifiche al database (> 15.000) ottengo questo errore Messaggio:Il pool di connessioni non è stato in grado di garantire una connessione al thread

Il pool di connessioni per il database '/ dati/data/...' è stata in grado di garantire una connessione a filo 312 (Thread-312) con flag 0x1 per 30.000002 secondi.

Tutto si blocca. Perché si verifica questo errore?

+0

Si prega di fornire maggiori informazioni su questo problema. Per esempio. stack tracce, si verifica su tutti i dispositivi testati ?, versioni Android testate, ... –

+0

Ho avuto lo stesso problema. Non ci sono tracce dello stack, questo stesso errore è apparso ripetutamente e non posso più accedere al database. Mi chiedo se da qualche parte in GreenDao ci siano transazioni aperte ma non concludano la transazione in una clausola finale. – Hiep

risposta

8

Non posso dire con certezza su questa particolare implementazione, ma c'è una connessione che di solito supporta un ORM. Il pool di connessioni apre un determinato numero di connessioni al database e le ricicla quando le chiudi e apri nuove connessioni. Ciò che questo errore ti sta dicendo è che probabilmente ha raggiunto un limite. Ciò può accadere per una grande varietà di motivi, uno è che probabilmente c'è un deadlock nel DB perché si stanno aggiornando due tabelle e due diverse transazioni stanno tenendo tavoli diversi in attesa che l'altro venga rilasciato. O semplicemente che ci sono troppe connessioni aperte e il DB o il pool di connessioni viene confuso.

Mi spiace che non sia davvero una risposta, ma avrete bisogno di consultare i documenti per GreenDAO per vedere come ciò potrebbe accadere.

+1

greenDAO non utilizza alcun pool di connessione. Le app con greenDAO si comportano esattamente come molte app Android che utilizzano SQLite. Ottieni un SQLiteDatabase usando una sorta di SQLiteOpenHelper. Le istanze di DaoMaster/DaoSession si riferiscono a questo oggetto SQLiteDatabase. –

32

Ho ricevuto questo messaggio quando voglio selezionare una query su una tabella che viene utilizzata su una transazione senza transazione conclusa prima. Problema risolto quando si esegue endTransaction() sul blocco finale della transazione.

+1

Pensa anche a creare batch durante l'importazione di set di dati di grandi dimensioni. Dì, crea 'endTransaction()' e inizia una nuova transazione dopo n entità. – melbic

0

Ho ricevuto questo messaggio durante la creazione di troppe connessioni a SQLite tramite DBFlow FlowQueryList. La mia soluzione era assicurarsi che una volta che avessi finito con l'elenco delle query per chiamare endTransactionAndNotify() e quindi close() sull'elenco di query.

Chiamare solo il endTransactionAndNotify() non ha fatto il trucco. Spero che questo aiuti, questo thread certamente mi ha aiutato.

Problemi correlati