14 | 存储优化(下):数据库SQLite的使用和优化
14 | 存储优化(下):数据库SQLite的使用和优化
讲述:冯永吉
时长15:53大小14.50M
SQLite 的那些事儿
SQLite 的其他特性
SQLite 的监控
总结
课后作业
赞 8
提建议
精选留言(16)
- HI2019-03-11大致的看了Matrix SQLiteLint的源码实现,由于Androd N hook sqlite3_profile 会出现问题,SQLiteLint 并不能实时的获取到sql语句,而是采用java层主动的告知SQLiteLint 要分析的sql,比如分析 select *,PrepareStatement, 而对于检测 Autoincrement,冗余索引,Without RowId 而是通过native层告知java层要查询的内容,java层将查询之后的内容再通知native层,这个检测的时间间隔为4秒,这4秒是有什么依据的吗
作者回复: 这些都是一些拍脑袋的经验值而已,也可以在GitHub上面提issue
3 - 黄小木🐵2019-02-15张老师好,提个问题,我们项目当前用的是ormlite关系型数据库框架,已经利用里面的api写了大量sql语句,请问如何最低成本的替换成wcdb呢?
作者回复: ormlite应该是ORM框架,跟底层的wcdb应该是不冲突的。
2 - 大土豆2022-02-03我有一个想法,老师看下是否合理,把MySQL(innodb)这套全部放到移动端来,唯一区别是MySQL是C/S模型,访问方式(连接层)改造下,改成移动端类似sqlite的db文件类型。这样,innodb的行级锁可强多了,然后MySQL总体是多线程读写并发的,不是能更好地榨干移动端的性能吗?微信有这么想过吗?
- JavanRhino2021-07-07PRAGMA SQLITE_THREADSAFE = 2 这个是用java代码设置吗?看源码好像没有提供java api呀
- JavanRhino2021-07-06对于 iOS 来说可能没有多进程访问数据库的场景,可以把 locking_mode 的默认值改为 EXCLUSIVE。 ——>应该是对于Android来说吧?共 1 条评论
- hs2020-11-10老师想问一下这句话的意思 “还有需要说明的是,同一个句柄同一时间只有一个线程在操作,这个时候我们需要打开连接池 Connection Pool” 为什么同一个句柄同一时间只有一个线程在操作,就需要开启线程池
- JeffMony2020-03-10这篇文章太深了
- lbj2020-01-01想咨询个问题,checkpoint是100pages一次,那假如app的生命周期中往sqlite写的数据加起来都不到100pages,那即使app被杀死了也没到触发checkpoint的临界值,这个时候这部分数据是直到n次app使用积攒到100pages在checkpoint还是怎么处理
- 满大大2019-12-10老师客户端怎么开启WAL模式
作者回复: SQLite有接口的
1 - OF2019-10-24哎,这辈子赶不上大佬了
- 薯条2019-10-05多线程、多进程 操作数据库的时候,可以得到一个database 对象,假如在某一个线程中调用了db.close 方法就会出现问题。看了好多方案,,最好的就如文章所说,不关闭db
- 薯条2019-10-05时间开发中 遇到过 “多线程操作sqlite3 导致数据库损坏的问题” 没想到 微信在这块做了这么多功夫
- godliness2019-09-26但是需要注意的是,写之间是仍然不能并发 Android 系统默认提供的 SQLiteConnecionPool ,主连接只有一个(可写的),否则在 Java 层多线程等待(这里是等待-释放-唤醒)。不会出现 SQLiteDatabaseLockedException共 1 条评论
- EchoSomeTH2019-07-2418:56.100 2712-2732/com.exampletest.liepin.chapter14_wcdb D/SqliteLint.Native: Lint::Check checked cnt=2 2019-07-24 19:18:56.101 2712-2732/com.exampletest.liepin.chapter14_wcdb V/SqliteLint.Native: SqlInfoProcessor::ParseObj wildcard_sql_ = insert into message values(?) 2019-07-24 19:18:56.102 2712-2732/com.exampletest.liepin.chapter14_wcdb V/SqliteLint.Native: Lint::PreProcessSqlInfo processRet:ret:0 2019-07-24 19:18:56.103 2712-2732/com.exampletest.liepin.chapter14_wcdb V/SqliteLint.Native: Lint::Check() already checked recently 2019-07-24 19:18:56.110 2712-2732/com.exampletest.liepin.chapter14_wcdb I/SqliteLint.Native: Lint::TakeSqlInfo queue empty and wait 这是 8.0 插入一条数据,调用notifySqlExecution才出来的,这个好像···没有啥有用数据撒展开
- L2019-02-17sqlite wal mode w模式sync mode 可以直接修改成OFF?若不行,怎么论证?谢谢!因为修改成OFF可以减少 DB fdatasync call
作者回复: 可以看看:https://www.sqlite.org/pragma.html#pragma_journal_mode PRAGMA schema.synchronous; PRAGMA schema.synchronous = 0 | OFF | 1 | NORMAL | 2 | FULL | 3 | EXTRA; Query or change the setting of the "synchronous" flag. The first (query) form will return the synchronous setting as an integer. The second form changes the synchronous setting. The meanings of the various synchronous settings are as follows: EXTRA (3) EXTRA synchronous is like FULL with the addition that the directory containing a rollback journal is synced after that journal is unlinked to commit a transaction in DELETE mode. EXTRA provides additional durability if the commit is followed closely by a power loss. FULL (2) When synchronous is FULL (2), the SQLite database engine will use the xSync method of the VFS to ensure that all content is safely written to the disk surface prior to continuing. This ensures that an operating system crash or power failure will not corrupt the database. FULL synchronous is very safe, but it is also slower. FULL is the most commonly used synchronous setting when not in WAL mode. NORMAL (1) When synchronous is NORMAL (1), the SQLite database engine will still sync at the most critical moments, but less often than in FULL mode. There is a very small (though non-zero) chance that a power failure at just the wrong time could corrupt the database in journal_mode=DELETE on an older filesystem. WAL mode is safe from corruption with synchronous=NORMAL, and probably DELETE mode is safe too on modern filesystems. WAL mode is always consistent with synchronous=NORMAL, but WAL mode does lose durability. A transaction committed in WAL mode with synchronous=NORMAL might roll back following a power loss or system crash. Transactions are durable across application crashes regardless of the synchronous setting or journal mode. The synchronous=NORMAL setting is a good choice for most applications running in WAL mode. OFF (0) With synchronous OFF (0), SQLite continues without syncing as s
- 嘿,抬头2019-01-15张老师,请教个问题: 启动一个Activity,可以查出数据库中数据,但切换下系统语言,Activity重启,却查不出数据库中的数据!!!(debug看到两次都执行了查询数据库的代码) 希望您指点一二,谢谢~
作者回复: 输入信息太少,如果是必现可以比较好搞,这个可以直接通过sql命令行查询一下
1