附加SQL Server数据库后获取间歇性连接错误

时间:2012-02-23 12:58:10

标签: sql-server database-connection

我遇到了一个无法解决的问题。我的开发团队有一套针对单元测试数据库运行的C#单元测试。在每次测试之前,需要将数据库恢复到其基线的起点。实现这一目标的最快方法是:

  1. 分离数据库。
  2. 使用基本的备份副本覆盖.mdf和.ldf文件。
  3. 附加数据库。
  4. 我通过从C#调用Transact SQL命令来执行这些操作。

    我遇到的问题是,大约50%的时间,打开与单元测试数据库的连接将失败 - 异常是不同类型的 - 但它们似乎都表明数据库不存在。如果我在Attach语句之后输入'sleep'命令,那么每次都可以成功打开数据库。我对此的解释是,必须有某种SQL Server后台进程针对数据库运行,以最终确定将数据库联机。因此,在执行sp_attach_db之后,直到几毫秒之后数据库才真正准备好使用。

    当然,我的解决方案可能是在每次数据库附加后执行'sleep'语句,但是有800个这样的测试,因此分离/恢复/附加过程尽可能快是至关重要的。

    有没有人有这方面的经验?有谁知道为什么数据库不能立即接受连接?有没有人知道我何时能够检测到数据库何时可以接受连接。

    提前致谢。

1 个答案:

答案 0 :(得分:1)

尝试关闭连接上的Pooling。当Pooling为ON时,当您在分离数据库时强行关闭它时,池中的连接会中断,因此当连接来自连接池时 - 第一批将失败。

只需添加到您的连接字符串Pooling=no

即可

PS:如果您的测试不是那么复杂,那么在事务中运行测试可以快得多,并且在完成清除数据库时简单地将其回滚