排查 SQL 适配器的操作问题
本部分讨论使用故障排除技术来解决在使用 Microsoft BizTalk Adapter for SQL Server 时可能会遇到的操作错误。
启用跟踪
必须在适配器、WCF LOB 适配器 SDK 和 SQL Server 之间启用跟踪,以收集有关使用 SQL 适配器时遇到的任何问题的详细信息。 有关 SQL 适配器中的跟踪支持的详细信息,请参阅 SQL 适配器中的诊断跟踪和消息日志记录。
已知问题
以下是使用 SQL 适配器时可能遇到的最常见错误及其可能的原因和解决方法。
加载适配器绑定时出错
问题
尝试启动添加适配器服务引用 Visual Studio 插件或使用适配器服务 BizTalk 项目加载项时,收到以下错误:
There was an error loading the binding, <binding name>, from your system configuration.
ConfigurationErrorsException: Exception has been thrown by the target of an invocation.
原因
尝试启动“添加适配器服务引用插件”或“使用适配器服务”加载项时,WCF 将加载所有已安装适配器的适配器绑定。 反过来,适配器绑定依赖于企业应用程序的特定客户端软件。 如果执行了适配器的“典型”或“完整”安装,该安装将安装 BizTalk 适配器包中包含的所有适配器,则可能会遇到此问题。 但是,LOB 客户端库可能只为一个企业应用程序安装。 因此,GUI 无法加载其他适配器的绑定。
分辨率
请确保对适配器进行自定义安装,以便仅安装所需的适配器。
SQL 适配器不显示在 BizTalk Server 管理控制台的适配器列表中
问题
与 BizTalk Server 随附的早期版本的适配器不同,BizTalk 适配器包随附的 SQL 适配器不会显示在 BizTalk Server 管理控制台的适配器列表中。
原因
最新的 SQL 适配器是 WCF 自定义绑定。 因此,尽管 BizTalk Server 管理控制台显示WCF-Custom适配器,但它不显示 WCF 自定义绑定,因此不显示基于 WCF 的 SQL 适配器。
分辨率
可以按照将 SQL 适配器添加到 BizTalk Server 管理控制台中所述的步骤,将 SQL 适配器显式添加到 BizTalk Server 管理控制台。
对SQL Server数据库执行操作时出错
问题
使用 BizTalk Server 对 SQL Server 数据库执行任何操作时,适配器会出现以下错误。
对于BizTalk Server
System.ArgumentNullException: Value cannot be null.
原因
未指定消息的 WCF 操作。 WCF 要求为每个操作指定 SOAP 操作,以通知适配器要对 LOB 应用程序执行的操作。
分辨率
在发送端口中指定 SOAP 操作,或指定为 BizTalk 业务流程中的消息上下文属性。 有关说明,请参阅 为 SQL 适配器配置 SOAP 操作。 请参阅 消息和消息架构 ,查看每个操作的操作列表。
执行 FILESTREAM 操作时 ErrorCode=5 的 InvalidOperationException
问题
使用 SQL 适配器执行 FILESTREAM 操作时收到以下错误。
System.InvalidOperationException: OpenSqlFileStream returned error.
ErrorCode:5
原因
你可能已指定用于连接到SQL Server数据库的数据库凭据。 若要执行 FILESTREAM 操作,必须始终使用 Windows 身份验证。 错误代码“5”表示由于凭据不正确而拒绝访问。 有关不同错误代码的详细信息,请参阅 系统错误代码 (0-499) 。
分辨率
使用 Windows 身份验证连接到 SQL Server 数据库。 在 BizTalk Server 管理控制台中,可以通过将“WCF-Custom或 WCF-SQL 端口配置”对话框中的用户名和密码字段留空来执行此操作。
即使为 PollingStatement 和 PolledDataAvailableStatement 指定了有效的语句,轮询操作也不会返回任何消息
问题
即使为 PollingStatement 和 PolledDataAvailableStatement 绑定属性指定了有效值,适配器也不会从SQL Server接收轮询消息。
原因
验证是否有任何其他事务对适配器正在轮询的表进行了锁定。
分辨率
如果要轮询作为另一个事务的一部分更新的表,可以考虑使用“with (nolock) ”参数作为为 PolledDataAvailableStatement 绑定属性指定的查询的一部分,以确保即使其他事务施加了锁,也会返回数据。 有关详细信息,请参阅 数据库引擎中的 SQL 锁定。
适配器无法在单个操作中使用 BizTalk Server
问题
SQL 适配器无法使用 BizTalk Server 在单个操作中插入、更新或删除大量数据。
原因
插入、更新或删除大量数据可能需要一段时间,并且执行操作的 SQL 适配器或事务可能会超时。
分辨率
对于BizTalk Server
在machine.config中指定 WCF 适配器的超时。导航到系统驱动器>:\WINDOWS\Microsoft.NET\Framework<\version>\CONFIG 下的<machine.config文件,并添加类似于以下内容的摘录。
<configuration> <system.transactions> <machineSettings maxTimeout="02:00:00" /> </system.transactions> </configuration>
使用此设置时,WCF 适配器超时设置为 2 小时。
在machine.config中指定 MSDTC 事务的超时设置。导航到系统驱动器>:\WINDOWS\Microsoft.NET\Framework<\version>\CONFIG 下的<machine.config文件,并添加类似于以下内容的摘录。
<system.transactions> <defaultSettings distributedTransactionManagerName="<computer_name>" timeout="02:00:00"/> </system.transactions>
使用此设置时,MSDTC 超时设置为 2 小时。 MSDTC 超时的默认值为 10 分钟。
重要
必须在运行适配器客户端和SQL Server的计算机上进行此更改。 在摘录中,将 computer_name> 替换为<运行适配器客户端和SQL Server的计算机的名称。
将 SQL 适配器的 SendTimeout 绑定属性设置为相当大的值。 有关如何设置绑定属性的说明,请参阅 配置 SQL 适配器的绑定属性。
对于包含数据集的响应消息,BizTalk Server中的完整架构验证失败
问题
对于返回包含数据集的响应消息的操作(例如 ExecuteReader),完整架构验证在BizTalk Server失败。
分辨率
建议不要对包含数据集的响应消息执行完整的架构验证。 可以执行以下操作:
执行一次操作,返回包含架构的响应消息。
将响应消息中的架构复制到 .xsd 文件,并将此文件添加到 BizTalk 项目。
在业务流程中使用 xpath 查询从响应消息中提取数据。
BizTalk 项目中的 RootNode TypeName 错误
问题
在 Visual Studio 中的 BizTalk 项目中,如果从使用适配器服务外接程序生成的架构包含 RootNode TypeName 属性的无效字符或保留字,则在编译项目时将发生以下错误:
Node <node reference> - Specify a valid .NET type name for this root node.
The current .NET type name of this root node is invalid (it is a reserved BizTalk Keyword or is an invalid C# identifier).
分辨率
右键单击错误中引用的 rood 节点,然后选择“ 属性”。
对于 RootNode TypeName 属性,请删除任何非法字符或保留字,例如 dot (.) 。
适配器无法使用临时表生成强类型存储过程的元数据
问题
适配器无法为其定义中包含临时表的强类型存储过程生成元数据。 适配器提供以下异常。
Microsoft.ServiceModel.Channels.Common.MetadataException:
Retrieval of Operation Metadata has failed while building WSDL at 'TypedProcedure/<schema>/<stored_procedure_name>' --->
System.Data.SqlClient.SqlException: Invalid object name '<temp_table_name>'.
分辨率
SQL 适配器不支持为其定义中包含临时表的强类型存储过程生成元数据。 相反,在使用“添加适配器服务引用插件”或“使用适配器服务加载项”时,应从“ 过程 ”节点下为同一过程生成元数据。
在 Visual Studio 中使用适配器时的绑定警告无效
问题
使用适配器在 Visual Studio 中创建应用程序并打开适配器生成的配置文件 (app.config) 时,会看到类似于以下内容的警告:
The element 'bindings' has invalid child element 'sqlBinding'. List of possible elements expected: 'basicHttpBinding, customBinding, ...
原因
出现此警告是因为 SQL 适配器绑定 sqlBinding
不是 Windows Communication Foundation (WCF) 附带的标准绑定。
分辨率
可以放心地忽略此警告。
如果在同一个应用程序中使用多个通知架构,或者在同一主机上的多个应用程序中使用通知架构,BizTalk Server将引发异常
问题
BizTalk Server引发 XLANG 异常或异常,指出应用程序找不到文档规范,因为多个架构与消息类型匹配。
原因
发生这种情况的原因是以下任一情况:
已在BizTalk Server项目中生成多个通知架构,将其部署到BizTalk Server应用程序,然后运行该应用程序以接收来自SQL Server数据库的通知。 由于通知架构很常见,因此BizTalk Server应用程序中部署的架构之间存在冲突。
如果有多个项目,则已为每个BizTalk Server项目生成通知架构,将每个项目部署到同一主机上的单独BizTalk Server应用程序,然后运行一个或多个应用程序以接收来自SQL Server数据库的通知。 由于架构和程序集可以在 BizTalk Server 中跨应用程序访问,因此在各种BizTalk Server应用程序和程序集下部署的常见架构之间存在冲突。
分辨率
将单个通知架构文件用于BizTalk Server应用程序。 如果需要在同一主机上的多个BizTalk Server应用程序中使用通知架构,请创建包含单个通知架构的应用程序,然后使用BizTalk Server中所有其他应用程序中的通知架构。
适配器客户端在适配器客户端和 SQL Server 数据库之间还原连接后,在执行操作时引发异常
问题
适配器客户端在对SQL Server数据库执行操作时引发以下异常:
{System.Data.Common.DbException} = {"A transport-level error has occurred when sending the request to the server. (provider: TCP Provider, error: 0 - An existing connection was forcibly closed by the remote host.)"}
原因
在执行操作期间,适配器使用来自 SQL ADO.NET 连接池的连接连接到SQL Server数据库,并执行该操作。 如果适配器客户端和SQL Server数据库之间短暂的网络中断,或者SQL Server数据库暂时关闭,则 SQL ADO.NET 连接池中的所有连接都无效。 还原连接并尝试对 SQL Server 数据库执行操作后,适配器将使用来自 SQL ADO.NET 连接池的相同无效连接,因此适配器客户端将引发异常。
分辨率
适配器客户端应在操作执行中实现重试逻辑,其中应捕获异常并将操作重试计数指定为“n+1”,其中“n”是为 MaxConnectionPoolSize 绑定属性指定的值。 这意味着,如果连接池中有“n”个连接数已呈现无效,则理论上适配器客户端应重试最多“n+1”次以获取有效连接,并因此执行操作。
例如,若要在 BizTalk Server 中指定重试计数,请在应用程序中打开发送端口的“属性”对话框,单击对话框左窗格中的“传输高级选项”,在“传输选项”区域中,在“重试计数”列表中指定一个值。
在事务处理入站操作中使用适配器时,内存使用量和线程计数增加
问题
在事务处理的入站操作(例如轮询)中, 如果要轮询的表中没有可用的数据 ,并且适配器继续轮询,则一段时间内内存使用量和线程计数会增加。
原因
如果轮询的表中没有可用数据,则在每次接收超时周期后,Windows Communication Foundation (WCF) 生成一个新线程以继续轮询操作。 因此,线程计数和内存使用量在一段时间内会增加。 但是,如果要轮询的表包含一些数据,则同一线程将继续执行所有后续轮询。
分辨率
建议将 ReceiveTimeout 设置为最大可能值,即 24.20:31:23.6470000 (24 天) ,以便每 24 天仅生成一个新线程。 这将确保内存使用量和线程计数不会过快增长太快。
注意
如果已设置 SqlAdapterInboundTransactionBehavior,请确保 TransactionTimeout 也配置为最大可能值,即 24.20:31:23.6470000 (24 天) 。 使用此解决方法时,仅当必须配置事务隔离级别时,我们才能添加 SqlAdapterInboundTransactionBehavior。 否则,最佳做法是删除该行为。
有关 ReceiveTimeout 绑定属性的详细信息,请参阅阅读有关 BizTalk 适配器SQL Server适配器绑定属性的信息。 有关指定绑定属性的说明,请参阅 配置 SQL 适配器的绑定属性。
注意
使用具有BizTalk Server的适配器时,将超时设置为较大值不会影响适配器的功能。