我的应用程序定期连接到 MyDatabase 并执行查询。
我需要处理 MyDatabase 数据库尚不存在且需要创建的情况。我目前正在做的是每次我第一次连接到主数据库并运行如下内容:
SELECT * FROM sysdatabases WHERE NAME='MyDatabase'
确定 MyDatabase 是否存在。如果不是,我创建它,然后继续连接到 MyDatabase 并执行查询。
每次打开与主数据库的单独连接并执行查询似乎是不必要的(即使连接是池化的)。为什么我不能直接连接到 MyDatabase?99% 的时间它会成功,我可以执行查询。它失败的 1% 我可以检测到 MyDatabase 丢失并在那时创建它,对吗?
但是当我尝试这个时,我遇到了一个问题。如果我尝试连接到 MyDatabase 但它不存在,我会收到 SqlException
无法打开登录请求的数据库 MyDatabase。登录失败。
美好的。伟大的。我可以捕获任何 SqlException,然后转到主数据库以确定 MyDatabase 不存在并创建它。
但是在创建它之后,当我现在尝试连接到 MyDatabase 时,我立即得到同样的错误:
无法打开登录请求的数据库 MyDatabase。登录失败。
看起来它没有尝试再次连接,而是返回缓存的结果。如果我在创建数据库后等待 10 秒再尝试连接它,则连接成功。
我的问题是,这种缓存是预期的(我猜是这样),更重要的是是否有处理这种情况的最佳实践?我可以使用的 SqlConnection API 中是否有缓存清除或超时设置?我认为我可以实现自己的超时延迟,但我想知道没有更好的方法我错过了。