2

我的应用程序定期连接到 MyDatabase 并执行查询。

我需要处理 MyDatabase 数据库尚不存在且需要创建的情况。我目前正在做的是每次我第一次连接到主数据库并运行如下内容:

SELECT * FROM sysdatabases WHERE NAME='MyDatabase'

确定 MyDatabase 是否存在。如果不是,我创建它,然后继续连接到 MyDatabase 并执行查询。

每次打开与主数据库的单独连接并执行查询似乎是不必要的(即使连接是池化的)。为什么我不能直接连接到 MyDatabase?99% 的时间它会成功,我可以执行查询。它失败的 1% 我可以检测到 MyDatabase 丢失并在那时创建它,对吗?

但是当我尝试这个时,我遇到了一个问题。如果我尝试连接到 MyDatabase 但它不存在,我会收到 SqlException

无法打开登录请求的数据库 MyDatabase。登录失败。

美好的。伟大的。我可以捕获任何 SqlException,然后转到主数据库以确定 MyDatabase 不存在并创建它。

但是在创建它之后,当我现在尝试连接到 MyDatabase 时,我立即得到同样的错误:

无法打开登录请求的数据库 MyDatabase。登录失败。

看起来它没有尝试再次连接,而是返回缓存的结果。如果我在创建数据库后等待 10 秒再尝试连接它,则连接成功。

我的问题是,这种缓存是预期的(我猜是这样),更重要的是是否有处理这种情况的最佳实践?我可以使用的 SqlConnection API 中是否有缓存清除或超时设置?我认为我可以实现自己的超时延迟,但我想知道没有更好的方法我错过了。

4

1 回答 1

4

我有完全相同的问题。

SqlConnection.ClearAllPools()当我在尝试打开新创建的数据库之前调用静态方法时,它工作正常!

于 2017-01-11T10:21:10.157 回答