如何解决sqlite多线程安全问题

FoxBabe 发布于 2013年09月04日
无人欣赏。

现在遇到一个问题,数据库是基于系统的sqlite写的,没有使用第三方库,项目现在处于维护阶段,需要优化。有个列表一次性会获取1000多条数据,每条数据都需要与本地的数据先比较下,如果没有则添加,如果有了就更新,如果标志为删除则删除。现在的做法是直接遍历这1000多条数据,分别进行操作,但是耗时比较大。考虑使用GCD的多线程处理,但是现在的数据库操作是非线程安全的,使用GCD就直接挂了,求解如何更好的处理?(因为处理维护阶段,不想替换为FMDB,工作量较大)或者如何是现在的数据库操作变为线程安全的?

共9条回复
灵感之源 回复于 2013年09月04日

把取回来到数据结合业务逻辑,让join成为可能,然后放到一个临时表,然后join现有的表,条件匹配exists就update,不能匹配就插入,如果标记删除就删除。

sqlite貌似没merge语句,所以你得写3个sql完整更新/插入和删除这3个操作

逐个记录做那是谋杀系统!我负责的数据库单表几十亿记录,每天更新1000万,如果我按照你这样做,我们的集群服务器无论多少台都要哭啊

FoxBabe 回复于 2013年09月04日

@灵感之源 谢谢,现在正在尝试使用sqlite的批量操作,只需单独的做插入、删除、更新操作,和你的这个建议应该类似。初入门,对数据库这块人认识远远还不够,谢谢指导!

vikiliu0310 回复于 2013年09月04日

哇,学习了~高手啊

王中王 回复于 2013年09月04日

“如果没有则添加,如果有了就更新” 用 REPLACE INTO 就可以了吧

灵感之源 回复于 2013年09月04日

SQLite现在有这个了?我当年弄SQLite的时候2.x貌似没这个

anxonli 回复于 2013年09月04日

题外话,以后新项目还是考虑使用CoreData吧,NSManagedObjectContext支持GCD,很好用。

Joey 回复于 2013年09月04日

最简单的方式就是使用FMDB

FoxBabe 回复于 2013年09月04日

下个项目FMDB或CoreData常识用起来,要跟上节奏!

登录 或者 注册