为 SQLITE 指定 SELECT 超时
Posted
技术标签:
【中文标题】为 SQLITE 指定 SELECT 超时【英文标题】:Specify SELECT timeout for SQLITE 【发布时间】:2012-01-13 08:39:58 【问题描述】:是否可以使用 SQLITE 指定 SELECT 查询可能花费的最长时间?
如果您有大桌子并且用户必须有可能输入免费搜索词,这种情况会很有用。如果没有快速找到搜索的术语,则扫描整个表,这可能需要很长时间,因为通常不能使用索引。
所以让 SQLITE 在几秒钟后放弃会很有用。
我通过 System.Data.Sqlite 使用 SQLITE,似乎 SqliteCommand.CommandTimeout 是我想要的,但由于某种原因,设置它似乎没有效果。也许我错过了什么。
【问题讨论】:
【参考方案1】:对于简单的选择查询,不,似乎没有办法在 SQLite 本身上设置超时或最大执行时间。文档中唯一提到超时的是the busy timeout。因此,如果您需要限制选择查询可以花费的最长时间,您需要在应用程序级别使用超时来包装您的连接,并在超过该超时时取消/关闭您的连接。如何做到这一点显然是特定于应用程序/语言的。
对于繁忙超时(连接停止等待清除锁之前的超时)您可以通过the provided C interface 或通过提供给您的应用程序的 SQLite 驱动程序来完成。
【讨论】:
链接中的BUSY处理函数不是只有在不能取表锁时才调用吗?而不是当查询需要很长时间时。 抱歉 - 我已更新我的答案以解决非忙碌超时问题。 谢谢!但是是否可以在选择操作仍在运行时取消连接(SqlLiteConnection)?我认为这必须从另一个线程完成。那安全吗?您是否在连接对象上调用 Close 方法? 因为它是对数据库的读取操作,所以我认为删除它在数据完整性方面并不安全,因为您不会修改任何数据。您如何取消连接实际上取决于您使用的语言/驱动程序,所以我无法为您提供太多帮助。但是,例如,在 Java 中,您可以使用第二个线程来监视连接,并在给定超时后将其终止。或者,您可以将连接放在它自己的线程中,并在超时后.interrupt()
它。
但是,如果您终止连接,我不确定数据库上的任何锁会发生什么情况。由于 SQLite 一次可以有多个读取器或单个写入器,我不知道 SELECT 查询是否仍将继续在后台运行,或者断开连接是否会停止执行。我想你只需要自己做一个实验看看会发生什么。以上是关于为 SQLITE 指定 SELECT 超时的主要内容,如果未能解决你的问题,请参考以下文章
Cassandra SELECT DISTINCT和超时问题