Zepo / GYDataCenter

An alternative to Core Data for people who like using SQLite directly.
MIT License
842 stars 132 forks source link

大量数据插入的时候, 查询会被阻塞 #26

Closed ianhwu closed 7 years ago

ianhwu commented 7 years ago

我看了一下源码, 在 - (void)asyncInDatabase:(void (^)(FMDatabase *db))block 这个方法中, 也是使用 FMDatabaseQueue , 但 FMDatabaseQueue 是一个串行的队列, 而且 GYDataContextQueue 中的队列也是一个串行的队列, 如果在同时有很多插入的时候, 查询就要等待插入完成来执行, 我想问一下,在使用查询的时候每次都开个异步线程来保证主线程不被阻塞吗?还是使用其他方法?

GYDataCenterTest.zip

Zepo commented 7 years ago

你给的这个 demo 里查询并没有被插入操作阻塞,第一次启动 app 查询能立马返回(此时 db 没有多少数据,save 还没全部执行完),第二次启动 app 查询返回慢是因为 db 里的数据量太大了,几十万条数据全部拿出来是需要几秒种时间。

Zepo commented 7 years ago

GYDataCenter 对你说的这种情况做过优化,注意 save 的时候 GYDataContext 那一层是 dispatchSync(dispatch 到 cache 队列),GYDbRunner 那一层是 dispatchAsync(dispatch 到 DB 队列),框架尽量的把任务放到 cache 队列执行(包括 cache 操作,拼接 sql 语句,准备 sql 的 binding 参数。。。),DB 队列仅仅是到 sqlite 执行 sql,以此来均衡两个队列的执行时长。

ianhwu commented 7 years ago

看到了, 所以说只要大数据量的查询开个线程就不会出问题了。