如何防止 LocalDB 在一段时间空闲后分离 MDF 文件
本文关键字:分离 MDF 文件 何防止 LocalDB 一段时间 | 更新日期: 2023-09-27 18:34:19
我正在构建一个 .NET 4.5 (winforms) 应用程序,该应用程序使用 LocalDB 处理本地 MDF 文件,使用以下连接字符串:
Data Source=(LocalDB)'v11.0;AttachDbFilename=|DataDirectory|'DB'DatabaseFile.mdf;Integrated Security=True;MultipleActiveResultSets=True
当我运行我的应用程序时,第一个SQL查询需要一些时间来执行 - 没有什么剧烈的,大约2或3秒。之后,所有下一个SQL查询将立即执行。我假设在第一次执行期间需要额外的秒数才能将 MDF 文件附加到本地 SQL Server 服务。右?
但是,我注意到,如果自上次执行 SQL 查询以来已经过去了 10 分钟(左右),则下一个 SQL 查询将再次花费 2-3 秒来执行。我假设经过一段时间的空闲时间后,MDF 会分离,当调用新的 SQL 命令时,它会再次重新附加它。
我想知道,有没有办法覆盖这种行为?
我知道我可以创建一个Timer
,每隔几分钟执行一次简单的查询,但是有没有更好,更干净的解决方案?
除非您保持连接打开,否则您的 LocalDB 实例将在几分钟后关闭。当您再次连接到它时,它会再次启动。这可以解释 2-3 秒的延迟。您可以调整关机超时,如此问题中所述。每隔几分钟打开一次连接是保持其运行的另一种方法。甚至不需要运行任何查询,但可能需要确保连接在连接池外部打开(至少在早期版本的 .NET 中,连接池用于返回连接而不对其执行任何 ping 操作)。
您还可以禁用数据库AUTO_CLOSE
选项,并防止从内存中卸载缓存。请参阅这篇关于SQL Server Express内存管理的详细博客文章,AUTO_CLOSE
部分直接适用于LocalDB。
我更怀疑您的数据/索引不再在内存中。
您可以运行一个非常快速的查询,例如选择"a"以了解它是否是连接时间。
至于强制您的表/索引保留在内存中。
我非常建议你让.NET和SQL做自己的内存管理。
2-3秒并不多。
查看查询计划 - 也许您可以使其更快(即使不在内存中)。