2012-07-31 6 views
22

Estoy usando GreenDAO para el manejo de bases de datos en Android. Al realizar muchos cambios en la base de datos (> 15.000) recibo este mensaje de error:El grupo de conexiones no ha podido otorgar una conexión al hilo

El grupo de conexiones para la base de datos '/ data/data/...' no ha podido otorgar una conexión al hilo 312 (Thread-312) con indicadores 0x1 durante 30.000002 segundos.

Todo se atasca. ¿Por qué ocurre este error?

+0

Proporcione más información sobre este tema. P.ej. rastros de pila, ¿ocurre en todos los dispositivos probados ?, ¿versiones de Android probadas? ... –

+0

Tengo el mismo problema. No hay ningún rastro de pila, este mismo error apareció repetidamente y ya no puedo acceder a la base de datos. Me pregunto si en alguna parte de GreenDao hay transacción abierta pero no transacción final en una cláusula finally. – Hiep

Respuesta

8

No puedo decir con certeza acerca de esta implementación en particular, pero hay un pool de conexiones que normalmente respalda un ORM. El grupo de conexiones abre un número determinado de conexiones a la base de datos y las recicla a medida que las cierra y abre nuevas conexiones. Lo que ese error te dice es que probablemente llegue a un límite. Eso puede suceder por una gran variedad de razones, una es que posiblemente haya un punto muerto en la base de datos porque está actualizando dos tablas y dos transacciones diferentes tienen mesas diferentes esperando que la otra lance. O simplemente que hay demasiadas conexiones abiertas y que la base de datos o el conjunto de conexiones se confunden.

Disculpe, no es realmente una respuesta, pero necesitará ver los documentos de GreenDAO para ver cómo podría suceder.

+1

greenDAO no usa ninguna agrupación de conexiones. Las aplicaciones con greenDAO se comportan como muchas aplicaciones de Android que usan SQLite. Obtienes una SQLiteDatabase usando algún tipo de SQLiteOpenHelper. Las instancias de DaoMaster/DaoSession se refieren a este objeto SQLiteDatabase. –

32

Recibí este mensaje cuando quiero seleccionar una consulta en una tabla que se usa en una transacción sin finalizar la transacción anteriormente. Problema resuelto al ejecutar endTransaction() en el bloque de transacción finalmente.

+1

También piense en hacer lotes cuando importe grandes conjuntos de datos. Digamos, haga 'endTransaction()' e inicie una nueva transacción después de n entidades. – melbic

0

Recibí este mensaje al crear demasiadas conexiones a SQLite a través de DBFlow FlowQueryList. Mi solución fue asegurarme de que una vez que haya terminado con la lista de consultas, llame al endTransactionAndNotify() y luego al close() en la lista de consultas.

Llamar a endTransactionAndNotify() solo no funcionó. Espero que esto ayude, este hilo ciertamente me ayudó.

Cuestiones relacionadas