我正在处理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-在1秒内完成数据库模型(数据库ID 3)的恢复(分析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’。
2014-03-31 08:21:05.65-SQL Server现在已准备好进行客户端连接。这是一条情报信息; 无需用户操作。
2014-03-31 08:21:09.21-在1秒内完成数据库模型(数据库ID 3)的恢复(分析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’。
基于此链接,最佳做法是查询Collation属性的值。
刚联机的数据库不一定已准备好接受连接。若要确定数据库何时可以接受连接,请查询sys.databases的collation_name列或DATABASEPROPERTYEX的Collation属性。
因此,当Collation属性不为null时,数据库已准备好进行连接。查询看起来像这样
SELECT DATABASEPROPERTYEX('MyDatabase', 'Collation')