数据库未启动但SQL Server已准备好进行连接时出现SqlException

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

基本上我通过连接字符串有一些连接的“缓存”。 第一次连接当然会发生这种情况,因此我的连接代码非常简单:

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

这是C#exception:

System.Data.SqlClient.SqlException:无法打开登录请求的数据库“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 – 错误:18456,严重性:14,状态: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 ms,重做0 ms,撤消468 ms。)这仅是一条信息性消息。 无需用户操作。

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经理已经开始。

2014-03-31 08:23:41.87 – 启动数据库’XXX’。

基于此链接 ,最佳做法是查询Collat​​ion属性的值。

刚上线的数据库不一定准备好接受连接。 要确定数据库何时可以接受连接,请查询sys.databases的collat​​ion_name列或DATABASEPROPERTYEX的Collat​​ion属性。

因此,当Collat​​ion属性不为null时,数据库就可以进行连接了。 查询看起来像这样

 SELECT DATABASEPROPERTYEX('MyDatabase', 'Collation')