数据库未启动,但SQL Server已准备好连接时发生SqlException异常

本文关键字:连接 异常 SqlException 准备好 启动 Server SQL 数据库 | 更新日期: 2023-09-27 18:19:00

我正在处理SQL Server的"准备连接"状态和我的数据库启动时的时间之间的相当长的延迟。有时需要两分钟以上。这就是为什么我有时会在数据库上线之前尝试连接它的原因。您知道如何缩短从"准备连接"到启动数据库之间的时间吗?或者我如何确定数据库是否在线,以便从我的c#应用程序连接到它?

基本上我有一些"缓存"连接的连接字符串。当然,这发生在第一次连接中,所以我的连接代码非常简单:

var result = new SqlConnection();
result.ConnectionString = "some connection string here";
try
{
   result.Open()
}
catch (Exception ex)
{
   //some logging stuff here
   throw;
}

这是c#的例外:

System.Data.SqlClient。无法打开登录请求的数据库"XXX"。登录失败

SQL Server日志:

2014-03-31 08:21:05.65 - SQL Server已经准备好连接客户端。这是一条信息信息;不需要用户操作。

2014-03-31 08:21:09.21 -数据库模型(数据库ID 3)的恢复在1秒内完成(分析234毫秒,重做0毫秒,撤消514毫秒)。不需要用户操作。

2014-03-31 08:21:11.52 - Error: 18456, Severity: 14, State: 38.

2014-03-31 08:21:11.52 -用户"YYY"登录失败。原因:未能打开显式指定的数据库。(客户:)

2014-03-31 08:21:13.88 -清空tempdb数据库。

2014-03-31 08:21:21.38 -数据库msdb(数据库ID 4)在2秒内恢复完成(分析327毫秒,重做0毫秒,撤销468毫秒)。不需要用户操作。

2014-03-31 08:21:32.98 -启动数据库'tempdb'.

2014-03-31 08:21:40.30 - Service Broker协议传输被禁用或未配置。

2014-03-31 08:21:40.41 -数据库镜像协议传输被禁用或未配置。

2014-03-31 08:21:41.50 -恢复完成。这只是一个信息消息。不需要用户操作。

2014-03-31 08:21:41.52 - Service Broker manager has started.

2014-03-31 08:23:41.87 -启动数据库'XXX'.

数据库未启动,但SQL Server已准备好连接时发生SqlException异常

基于此链接,最佳实践是查询排序属性的值。

刚刚上线的数据库不一定准备好接受连接。要确定数据库何时可以接受连接,请查询sys的collation_name列。数据库或DATABASEPROPERTYEX的Collation属性。

因此,当Collation属性不为空时,数据库已准备好进行连接。查询如下所示

SELECT DATABASEPROPERTYEX('MyDatabase', 'Collation')