连接池无法向线程提供连接。

31

我在Android中使用GreenDAO处理数据库。当执行多个数据库更改(>15,000)时,我会收到以下错误消息:

数据库 “/data/data/…” 的连接池无法为标志为0x1的线程312(Thread-312)授予连接30.000002秒。

所有操作都卡住了。为什么会出现这个错误?


请提供更多关于此问题的信息。例如,堆栈跟踪,是否在所有测试设备上发生?已测试的Android版本等。 - Markus Junginger
我遇到了同样的问题。没有堆栈跟踪,这个错误一再出现,我无法再访问数据库了。我想知道在GreenDao中是否有未结束事务的finally子句中开放的事务。 - Hiep
3个回答

36

当我想在一个正在进行的交易中选择一个表上的查询时,出现了这个消息。在交易的finally块中执行endTransaction()后问题得到解决。


1
在导入大型数据集时,考虑批处理。例如,在n个实体后执行endTransaction()并启动新事务。 - melbic

12
我不能确定这个具体实现情况,但通常有一个连接池支持ORM。连接池打开一组与数据库的连接,并在您关闭它们并打开新连接时进行回收利用。错误提示告诉您的是,它可能达到了限制。这可能由于许多原因导致,其中一个可能是DB中存在某些死锁,因为您正在更新两个表格,而两个不同的事务正在持有不同的表格等待另一个释放。或者仅仅是因为有太多的打开连接,使得DB或连接池变得混乱。
抱歉这没有真正的答案,但你需要查看GreenDAO文档以了解这种情况如何发生。

2
greenDAO本身不使用任何连接池。使用greenDAO的应用程序与使用SQLite的许多Android应用程序一样。您可以使用某种SQLiteOpenHelper获取SQLiteDatabase。DaoMaster/DaoSession的实例引用此SQLiteDatabase对象。 - Markus Junginger

0

当通过DBFlow FlowQueryList创建太多的SQLite连接时,我收到了这个消息。我的解决方案是确保一旦完成查询列表,就调用endTransactionAndNotify(),然后在查询列表上调用close()

仅调用endTransactionAndNotify()并不能解决问题。希望这可以帮助你,这个线程肯定对我有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接