The*_*ude 7 database delphi sqlite concurrency
(在WAL模式下使用Delphi 2010 +最新的SQLite)
我正在使用DISQLite(SQLite的Delphi端口)和我的多线程客户端应用程序(尚未发布,所以如果我真的需要,我可以更改数据库引擎)
我的分析人员明确表示这是一个愚蠢的决定,我将其跟踪到2-3个非常简单的SQL语句,这些语句在单线程应用程序中执行时会飞,但因为线程锁定/等待(SQLite在尝试多个线程时效果不佳)同时写)
我尽力优化我的代码/避免瓶颈,但经过几周的努力,我现在想知道转储SQLite并选择不同的数据库引擎(?)是否更容易
我的要求是:
我只使用带索引的基本INSERT/UPDATE/DELETE命令,没什么特别的.所以我的SQL要求是相对基本的(我不需要加入或其他"更高级"的sql东西).
我也对NQL解决方案持开放态度,只要它支持上述要求.
我的研究导致了Berkley DB,如果我理解正确的话,它是一个带有并发写入支持的SQLite的修改版本,但问题是它不是真正的delphi.
我也读过京都内阁,但话说再说一遍,没有德尔福的支持:(
任何建议都会受到欢迎,
谢谢!
FWIW,我最终决定坚持使用 DISQLite 以及这个“丑陋的”、hackish 的解决方案:
进行了一些(不那么小的)更改,以尽可能减少线程内对数据库的写入(每个线程中需要两次数据库插入)
当我在线程内工作时绝对必须向数据库写入一些内容时,我获取 SQL 查询参数并将它们写入一个特殊的文件夹中(写入文件非常快),即。
C:\my-project\pending-sql\insert_SOME-GUID.txt
每个文件看起来像这样:
参数1|参数2|参数3|参数4|
一旦我完成了线程(或者如果我的应用程序崩溃),我就会调用一个例程来扫描此文件夹,提取 SQL 参数并使用准备好的语句(包装在事务内)运行它们。
任何包含少于 4 个参数的文件都将被视为损坏并被跳过。
这是一个非常丑陋的算法(对我来说是耻辱!),但它有效,速度快,(有点)ACID,而且我不必花几个月的时间学习另一个可能(也可能不是)的数据库引擎合适的。
我只是想感谢大家的帮助,时间压力使我不可能切换到另一个数据库引擎,至少对于这个项目来说是这样。