2017-01-02 87 views
2

我为我的.NET程序创建了一个Dockerfile。该程序在我的桌面上以及没有Docker的Windows Server 2016(Azure VM)上运行良好。当我尝试将其作为容器运行时(基于microsoft/windowsservercore),那么当连接到我的Azure SQL实例时,我经常会遇到数据库错误。Windows容器导致Azure SQL连接失败

我有两个Azure SQL实例正在运行(P1和空载)。当建立连接时,它们非常快,但问题是连接通常无法建立。看起来网络非常不稳定。这些是我扔的典型错误:

System.Data.SqlClient.SqlException: A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server)

内部异常报告网络路径找不到。起初我以为它可能是我的本地机器,但它在Azure中的Windows Server 2016(带容器)VM实例上也存在问题。

为了查明问题,我创建了一个每5秒钟连接到我的数据库的测试程序(并运行SELECT COUNT(*) from sysobjects)。这个程序总是能够找到数据库。

看来,我的其他程序经常在启动过程中失败,但在初始化过程中有很多数据库调用。我怀疑线程,连接池,有什么不同...

任何线索?

回答

1

看起来很奇怪,错误消息来自命名管道提供程序,因为Azure SQL只能通过TCP/IP进行连接。不知何故,它似​​乎回退到命名管道,可以通过在tcp:前加上主机名来阻止。所以,我的连接字符串看起来像:

Server=tcp:example.database.windows.net;Database=<dbname>;User Id=... 

这可以防止服务器从回落到尝试使用命名管道和我还没有看到这个问题了。

不幸的是,我还没有找到在某些情况下使用命名管道提供程序的原因。它应该由microsoft/windowsservercore图片中的某些配置引起,因为我从来没有看到Docker镜像之外的错误消息。否则,我会怀疑Azure SQL的限制机制(尽管负载很低)。

+0

命名管道提供的是一个在哪些SQL尝试,如果你没有明确设置协议使用协议的顺序。所以如果你想避免首先尝试netpipes,你必须强制SQL使用tcp。 –

2

我们目前也遇到了Windows Container的更多网络问题。但是对于像Azure/Containers一样的软件定义网络,一般建议使用一些重试逻辑。

如果您使用实体框架,则可以插入不同的弹性和重试策略“SqlAzureExecutionStrategy”。这通常不仅适用于Azure,而且可以帮助减少异常。

本文介绍如何: https://msdn.microsoft.com/en-us/library/dn456835(v=vs.113).aspx

相关问题