我正在使用此连接字符串构建一个.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
,每隔几分钟执行一次简单的查询,但是有更好,更清洁的解决方案吗?
答案 0 :(得分:4)
除非您保持连接打开,否则几分钟后您的LocalDB实例将关闭。再次连接时它会再次启动。这可以解释2-3秒的延迟。您可以调整关闭超时,如this question中所述。每隔几分钟打开一个连接是另一种保持连接的方法。甚至不需要运行任何查询,但是您可能需要确保在连接池之外打开连接(至少在.NET的早期版本中,连接池用于返回连接而不对其执行任何ping操作)。
您还可以禁用数据库的AUTO_CLOSE
选项,并防止从内存中卸载缓存。请参阅SQL Server Express中有关内存管理的this detailed blog post,AUTO_CLOSE
部分直接适用于LocalDB。
答案 1 :(得分:1)
我更怀疑你的数据/索引不再存在于内存中。
你可以运行一个非常快速的查询,比如选择' a'知道是否是连接时间。
强制你的表/索引留在记忆中 我非常建议你让.NET和SQL做自己的内存管理。
2-3秒并不多 查看查询计划 - 也许你可以让它更快(甚至不在内存中)。