连接超时在web.config文件的connectionString中指定,如下所示:
"Data Source=dbs;Initial Catalog=db;"+"Integrated Security=SSPI;Connection Timeout=30"
时间以秒为单位。我想以毫秒为单位指定连接超时,比如说500毫秒。我怎么能这样做?
编辑1:我想这样做来创建一个ping方法,只检查数据库是否可以访问。
编辑2:我一直在寻找一些类似的解决方案,而answer提到了指定超时(以毫秒为单位)。所以我很好奇,想知道如何做到这一点。
答案 0 :(得分:4)
首先,请确保您使用非池连接以确保始终获得全新连接,您可以通过在连接字符串中添加Pooling=false
来实现此目的。对于这两种解决方案,我还建议添加Connection Timeout=1
以确保在应用程序放弃后ADO.NET不会不必要地继续打开连接。
对于.Net 4.5,您可以使用新的OpenAsync
方法和CancellationToken
来实现短暂超时(例如500毫秒):
using (var tokenSource = new CancellationTokenSource())
using (var connection = new SqlConnection(connectionString))
{
tokenSource.CancelAfter(500);
await connection.OpenAsync(tokenSource.Token);
}
如果超时,您应该会看到Task
返回的OpenAsync
进入已取消状态,这将导致TaskCanceledException
对于.Net 4.0,您可以在Task
中打开连接并等待所需的时间:
var openTask = Task.Factory.StartNew(() =>
{
using (var connection = new SqlConnection(connectionString))
{
connection.Open();
}
});
openTask.ContinueWith(task =>
{
// Need to observe any exceptions here - perhaps you might log them?
var ignored = task.Exception;
}, TaskContinuationOptions.OnlyOnFaulted);
if (!openTask.Wait(500))
{
// Didn't complete
Console.WriteLine("Fail");
}
在此示例中,openTask.Wait()
将返回bool
,表示Task
是否已完成。请注意,在.Net 4.0中,您必须观察任务中抛出的所有异常,否则会导致程序崩溃。
如果您需要4.0之前版本的.Net请告诉我。