我想知道是否有办法对数据库进行异步调用?
例如,假设我有一个需要很长时间才能处理的大请求,我想发送请求并在请求返回值时接收通知(通过传递监听器/回调或其他东西).我不想阻止等待数据库回答.
我不认为使用线程池是一种解决方案,因为它不能扩展,在繁重的并发请求的情况下,这将产生大量的线程.
我们正面临网络服务器的这种问题,我们通过使用select/poll/epoll系统调用找到了解决方案,以避免每个连接有一个线程.我只是想知道如何在数据库请求中使用类似的功能?
注意:我知道使用FixedThreadPool可能是一个很好的解决办法,但我很惊讶没有人开发出一个真正异步的系统(没有使用额外的线程).
**更新**
由于缺乏真正实用的解决方案,我决定自己创建一个库(finagle的一部分):finagle-mysql.它基本上解码/解码mysql请求/响应,并在引擎盖下使用Finagle/Netty.即使有大量的连接,它也能很好地扩展.
我对访问SQLiteDatabase. 它应该是一个连接或多个连接才能从多个线程访问。我已经阅读了很多文章,包括以下两篇。
/sf/answers/258291841/ http://touchlabblog.tumblr.com/post/24474398246/android-sqlite-locking
这两者都建议使用单一连接。甚至我自己对同一问题的回答也被 OP 接受了。我使用了Singleton访问SQLiteopenHelper类的方法。
但是在阅读了enableWriteAheadLogging哪些州的文档后我仍然感到困惑
此方法支持从同一数据库上的多个线程并行执行查询。它通过打开到数据库的多个连接并为每个查询使用不同的数据库连接来实现这一点。数据库日志模式也更改为允许写入与读取同时进行。
现在这是令人困惑的部分。如果我想从多个线程同时访问数据库,我可以Singleton访问SQLiteOpenHelper它,在我的理解中这意味着插入的串行执行,同时同步读取可以无错误地完成。但是上面的文档说,为了同时访问,enableWriteAheadLogging应该调用它返回创建多个连接。这是怎么回事??如果我getWritableDatabase()通过Singleton SQLiteOpenHelper从多个线程调用using来进行插入,这意味着什么?电话会是连续的吗?应该enableWriteAheadLogging叫?
请说清楚。
sqlite multithreading android sqliteopenhelper android-sqlite