Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Docker Windows容器导致Azure SQL连接失败_Docker_Azure Sql Database_Windows Container - Fatal编程技术网

Docker Windows容器导致Azure SQL连接失败

Docker Windows容器导致Azure SQL连接失败,docker,azure-sql-database,windows-container,Docker,Azure Sql Database,Windows Container,我已经为我的.NET程序创建了一个Dockerfile。该程序在我的桌面和没有Docker的Windows Server 2016(Azure VM)上运行良好。当我尝试将其作为容器(基于)在内部运行时,在连接到Azure SQL实例时经常会出现数据库错误 我有两个Azure SQL实例正在运行(P1和空载)。当可以建立连接时,它们的速度相当快,但问题是连接通常无法建立。看起来网络很不稳定。这些是向我抛出的典型错误: System.Data.SqlClient.SqlException:与网络相

我已经为我的.NET程序创建了一个Dockerfile。该程序在我的桌面和没有Docker的Windows Server 2016(Azure VM)上运行良好。当我尝试将其作为容器(基于)在内部运行时,在连接到Azure SQL实例时经常会出现数据库错误

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

System.Data.SqlClient.SqlException:与网络相关或 建立到的连接时发生特定于实例的错误 SQL Server。找不到服务器或无法访问服务器。验证 实例名称正确且SQL Server配置为 允许远程连接。(提供程序:命名管道提供程序,错误:40)- 无法打开与SQL Server的连接)

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

为了找出问题所在,我创建了一个测试程序,每5秒连接一次数据库(并从sysobjects运行
SELECT COUNT(*)。这个程序总是能成功地找到数据库

我的另一个程序似乎在启动时经常失败,但在初始化期间有很多数据库调用。我怀疑线程、连接池


有人知道线索吗?

奇怪的是,错误消息来自命名管道提供程序,因为Azure SQL只能通过TCP/IP连接。不知何故,它似乎回到了命名管道,这可以通过在主机名前面加上
tcp:
来防止。因此,我的连接字符串类似于:

Server=tcp:example.database.windows.net;Database=<dbname>;User Id=...
Server=tcp:example.database.windows.net;数据库=;用户Id=。。。
这可以防止服务器退回到尝试使用命名管道的状态,我再也没有看到过这个问题


不幸的是,我还没有找到在某些情况下使用命名管道提供程序的原因。这应该是由映像内的某些配置引起的,因为我从未在Docker映像外看到错误消息。否则,我可能会怀疑Azure SQL的节流机制(尽管负载非常低)。

目前,Windows容器也遇到了更多的网络问题。但对于软件定义的网络,如Azure/容器中的网络,一般建议有一些重试逻辑

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

本文介绍了如何:

命名管道提供的是SQL在未明确设置要使用的协议时尝试使用的协议的第一顺序。因此,如果要避免首先尝试netpipes,就必须强制SQL使用tcp。