类似(如果不是同一个问题)Network path not found exception encountered randomly,但我有代码重现问题所以我想再问一遍,因为它似乎是一个独立于硬件的真正问题,可以复制。
这是错误:
provider:Named Pipes Provider,错误:40 - 无法打开与SQL Server的连接)---> System.ComponentModel.Win32Exception(0x80004005):找不到网络路径 在System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject,UInt32 waitForMultipleObjectsTimeout,Boolean allowCreate,Boolean onlyOneCheckConnection,DbConnectionOptions userOptions,DbConnectionInternal& connection) 在System.Data.ProviderBase.DbConnectionPool.WaitForPendingOpen()
为了重现这一点,我创建了一个每分钟都运行的控制台应用程序(我们还有一个Dapper DAL测试,因此参数):
internal class Program
{
private static int _totalOpenConnections;
private static readonly Stopwatch Timer = new Stopwatch();
private static bool _hasError;
private static int Main(string[] args)
{
var list = Enumerable.Range(1, Settings.Default.TotalCommandsToExecute);
// simple ADO.NET test
if (args.Length > 0 && args[0].Equals("ado", StringComparison.OrdinalIgnoreCase))
{
Console.WriteLine("Beginning ADO.NET Test...");
Timer.Restart();
Parallel.ForEach(list, new ParallelOptions {MaxDegreeOfParallelism = Settings.Default.ConcurrentCount},
i => AsyncContext.Run(async () =>
{
try
{
PrintStatus(i);
await TestADONet();
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
_hasError = true;
}
}));
Timer.Stop();
Console.WriteLine($"Completed ADO.NET Test in {Timer.ElapsedMilliseconds} ms");
}
if (_hasError)
return 1;
return 0;
}
private static void PrintStatus(int index)
{
Console.WriteLine(
$"Started: {index} of {Settings.Default.TotalCommandsToExecute}\tCurrently Open: {_totalOpenConnections}");
}
private static async Task TestADONet()
{
using (var conn = new SqlConnection(Settings.Default.TestConnection))
{
await conn.OpenAsync();
Interlocked.Increment(ref _totalOpenConnections);
var command = new SqlCommand("SELECT 1 Field1, 2 Field2, 3 Field3", conn);
var reader = await command.ExecuteReaderAsync();
while (reader.Read())
{
var result = new TestEntity
{
Field1 = reader.GetInt32(0),
Field2 = reader.GetInt32(1),
Field3 = reader.GetInt32(2)
};
}
}
Interlocked.Decrement(ref _totalOpenConnections);
}
public class TestEntity
{
public int Field1 { get; set; }
public int Field2 { get; set; }
public int Field3 { get; set; }
}
}
应用程序设置ConcurrentCount = 100,TotalCommandsToExecute = 200.想法是使用async命令并行地点击连接池。
此应用程序重现了它,但它也出现在控制台应用程序,Web应用程序(ASP.NET MVC和ASP.NET WebForms)的生产中。
它也相当随机地发生。我们已经让Rackspace和一些DBA在这个问题上爬行环境无济于事,这导致了这个应用程序 - 它在开发环境中重现了它。
连接字符串相当平淡,形式为"数据源=;数据库=;用户ID =;密码="
SQL Server 2014,但这是针对两个单独的服务器(dev / rackspace)
发生的测试中的查询是故意的良性
"SELECT 1 Field1, 2 Field2, 3 Field3"
测试确实使用Nito.AsyncEx(这里唯一没有使用的系统程序集)来获得异步支持。问题再次发生在不使用此程序集的其他应用程序中,因此我不认为这是一个问题 - 如果没有,请告诉我,我将以另一种方式重现它。
任何想法都非常感谢!
答案 0 :(得分:4)
问题在于命名管道。 可能在VM中更多地表达(来自以下链接的推测)。通过在连接字符串中添加tcp:并指定端口解决问题来使用TCP / IP。
一些相关案例:
结论,始终显式使用TCP / IP,除非SQL Server在同一台计算机上。您可以将SQL Server配置为不接受命名管道,但是我将继续将其添加到我的连接字符串中。