gpt4 book ai didi

ios - 使用事务优化 SQLite

转载 作者:行者123 更新时间:2023-12-02 07:30:20 26 4
gpt4 key购买 nike

我创建了一个 iOS 应用程序,当用户点击按钮时,将创建一个线程,并且该线程将执行 SELECT 语句 50 次。我从 http://web.utk.edu/~jplyon/sqlite/SQLite_optimization_FAQ.html#transactions 读到了一种优化技术它写道,(强调我的)

Unless already in a transaction, each SQL statement has a new transaction started for it. This is very expensive, since it requires reopening, writing to, and closing the journal file for each statement. This can be avoided by wrapping sequences of SQL statements with BEGIN
TRANSACTION;
and END TRANSACTION; statements. This speedup is also obtained for statements which don't alter the database.

因此,我尝试在线程的开头添加 BEGIN TRANSACTION;END TRANSACTION; 以及线程的末尾,我发现它减少了运行时间减半。但是,由于是在线程中,有时会出现这样的情况:

BEGIN TRANSACTION from thread 1
BEGIN TRANSACTION from thread 2
END TRANSACTION from thread 2
END TRANSACTION from thread 1

第二个 BEGIN 和第二个 END 语句将失败。因此,我想将 BEGIN/END 语句移出线程 即在应用程序开始时仅调用一次 BEGIN ,在应用程序结束时调用 END 。但不知道会不会占用内存?即在应用程序的整个生命周期中打开事务而不提交它。该数据库是只读的,因为它与应用程序捆绑在一起。

感谢您的帮助。

最佳答案

如果它是只读数据库,请尝试使用打开它

sqlite3_open_v2("path/to/database", &connection,
SQLITE_OPEN_READONLY | SQLITE_OPEN_FULLMUTEX, 0);
sqlite3_exec(connection,
"PRAGMA locking_mode = EXCLUSIVE; PRAGMA journal_mode = OFF;",
0, 0, &errmsg);

然后在所有线程之间共享connection对象。这应该可以让您获得保持事务打开的所有性能优势,而不必保持事务打开。 (您可能不需要第二个命令。我想 SQLite 足够聪明,能够认识到它不需要锁定或记录只读连接,但我不相信它是这样。)

关于ios - 使用事务优化 SQLite,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5366779/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com