我正在处理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#例外:
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毫秒,重做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经理已经开始。
2014-03-31 08:23:41.87 - 启动数据库'XXX'。
答案 0 :(得分:3)
基于this link,最佳做法是查询Collation属性的值。
刚上线的数据库不一定准备好接受连接。要确定数据库何时可以接受连接,请查询sys.databases的collation_name列或DATABASEPROPERTYEX的Collation属性。
因此,当Collation属性不为null时,数据库就可以进行连接了。查询看起来像这样
SELECT DATABASEPROPERTYEX('MyDatabase', 'Collation')