美文网首页iOS DeveloperIOS
一次SQLite的踩坑记录

一次SQLite的踩坑记录

作者: flightlessBirdT | 来源:发表于2017-01-11 15:55 被阅读202次

首先说一下问题点吧。
最近在优化旧代码。优化两个界面的渲染速度时踩了个坑。因为这两个界面的数据量比较大,所以之前一直有做缓存处理。离线缓存功能是一位老同事写的,用的SQlite。当时也没多看,没想到上线后一直被吐槽数据量过大时加载有卡顿现象。于是我从图层渲染到数据加载都优化了一下,也的确流畅了很多。但接着 bug就来了。

[图片上传中...(屏幕快照 2018-07-12 上午10.49.33.png-4b0de1-1531363901156-0)]

然后一级一级往上调试....一直找不出原因。果断求助stack,发现原来是线程导致的数据安全问题。


屏幕快照 2018-07-12 上午10.49.33.png

然后我想了一下,确实是。因为之前加载界面时首先读取的是数据库的数据,而且是在主线程(这么明显的错误我当时居然没发现),于是我把读取缓存的操作放到了子线程完成,数据读取完成后回到主线程做UI处理。没想到就导致了这个bug。在多线程模式下,并发对同一个数据库连接调用sqlite3_prepare_v2()来创建prepared statement,或者对同一个数据库连接的任何prepared statement并发调用sqlite3_bind_*()和sqlite3_step()等函数都会出错(在iOS上,该线程会出现EXC_BAD_ACCESS而中止)。这种错误无关读写,就是只读也会出错。因为SQLitePersistentObject这个东西太老了,对多线程的支持很不友好,放到子线程操作会有问题。但现在也没时间去重做离线缓存功能。只能先继续放到主线程操作。

哎.....别人的旧代码是一踩一个坑。

听说Realm不错,有时间了解一下。

相关文章

  • 一次SQLite的踩坑记录

    首先说一下问题点吧。最近在优化旧代码。优化两个界面的渲染速度时踩了个坑。因为这两个界面的数据量比较大,所以之前一直...

  • springboot集成swagger2深坑

    记录一次swagger2踩坑记,网上资料杂乱而不完整,自己踩的坑还算比较多,记录下自己的解决历程 一、首次来看看遇...

  • 2020-10-19随笔 踩坑0传值

    踩坑:当值传入0时,if条件判断时候会自己转换,记录踩坑。

  • Weex入门踩坑记录

    Weex入门踩坑记录

  • 日常bug记录

    想记录日常碰到的bug,坑踩多了,以后应该碰到坑就比较容易处理或者会少踩坑,后面会慢慢记录bug,截图bug以及最...

  • 2020-04-23

    FLutter Plugin踩坑记录 第一次写这类记录文章,写的比较稀烂,直入主题吧 因为...

  • 没事请多踩踩坑!

    人生事不尽意,别人挖坑我踩坑。 请在这里留下你的踩坑记录,让别人少入坑。

  • Flutter 开发记录

    Flutter 开发踩坑记录(干货总结)

  • Windows下GithubPages博客快速搭建

    Windows下开发坑总是比较多的,但是本人没Mac,只好踩一遍坑记录下。本文主要是安装过程&踩坑记录,故不对细节...

  • Python读取大文件的"坑“与内存占用检测

    python读写文件的api都很简单,一不留神就容易踩”坑“。笔者记录一次踩坑历程,并且给了一些总结,希望到大家在...

网友评论

    本文标题:一次SQLite的踩坑记录

    本文链接:https://www.haomeiwen.com/subject/rvdrbttx.html