【发布时间】:2012-12-05 22:32:28
【问题描述】:
tl;dr 版本
在运行几个晚上后,我在使用 OLE DB (SNC10.0) 连接管理器时遇到错误,连接是否无法正常超时?切换到 ADO.NET 连接管理器和源似乎可以解决问题,为什么?
我为通用标题道歉,但有太多细节无法在一行中说明。
技术:
在所有情况下,数据库服务器,源和目标都是 SQL Server 2008 R2
设置:
我有一组在半夜一个接一个运行的 SSIS 包。目前有7个。它们都执行一组类似的任务:它们首先连接到源数据库并将数据复制到暂存数据库。然后他们在暂存数据库中进行各种转换。最后,该过程连接到目标数据库并用数据填充它。
我将所有连接设置为 OLE DB 连接 (SQL Native Client 10.0),以便我可以将它们与 Lookup 组件和其他特定于 OLE 的组件一起使用。
问题:
我们在自动运行 SSIS 包时反复遇到问题。一般来说,我会从我的站手动测试它,它会运行良好;然后我们将 SSIS 包保存到 SQL Server 并安排它,它会运行良好。几晚后,我们会收到这样的问题:
SSIS 错误代码 DTS_E_OLEDBERROR。发生 OLE DB 错误。错误代码:0x80004005。 OLE DB 记录可用。来源:“Microsoft OLE DB Provider for SQL Server”Hresult:0x80004005 描述:“TDS 流中的协议错误”。
或
SSIS 错误代码 DTS_E_OLEDBERROR。发生 OLE DB 错误。错误代码:0x80004005。 OLE DB 记录可用。来源:“Microsoft SQL Server Native Client 10.0”Hresult:0x80004005 描述:“从 SQL Server 收到未知令牌”。
当在线搜索时,这两个都指向连接问题,特别是网络连接问题。
解决方法:
我发现解决这些问题的一个快速(即使并非总是简单)的方法是用 ADO NET 源而不是 OLE DB 源替换源节点。在某些情况下,这在我的数据流任务中是可以接受的,但在我需要使用查找组件或其他仅适用于 OLE 源的此类工具的情况下,如果我仍然会遇到,这不是一个足够好的解决方案这些问题。
问题:
我知道 ADO.NET 和 OLE DB 连接之间存在大量差异,但我注意到的一件主要事情是 OLE DB 连接管理器有两个超时,都默认为“0”值,这通常意味着禁用(没有超时)。 ADO.NET 连接管理器有一个超时,它设置为“15”(15 秒)的值。
这两个连接管理器如何处理超时和关闭连接?如果 OLE DB 连接管理器超时值为 0,除非在 SQL Server 上执行某些操作,否则该连接是否永远不会关闭?这可能是我的问题的一部分,有这么多数据流任务打开 OLE DB 连接然后没有被关闭?我可以在 SSIS 包中做些什么来强制关闭这些连接吗?
****编辑****
这是相关数据流任务的屏幕截图。为了保护无辜等,我改了一些名字。
如图所示的任务将完全正常运行,并且 100% 的时间都可以正常工作。如果我将该 ADO.NET 源更改为 OLE DB 源,则会收到帖子中提到的错误。在其他一些情况下,我通过扩展源查询经历并消除了查找。在这个任务中我没有。
【问题讨论】:
-
我们喜欢这里的细节 ;P 只是为了了解基础知识:您的系统在补丁方面做得如何?您是否从脚本任务/组件手动创建 OLE DB 连接?假设包没有失败,它通常运行多长时间?您是否使用 MSDTC 处理事务?它是否始终在特定软件包上失败?如何在特定任务上持续失败?
-
感谢您的提问。好的,我会验证补丁,但我相信它们是最新的。我在底部窗格中手动创建 OLE DB 连接管理器,然后在数据流任务中创建 OLE DB 数据源组件实例并将它们指向连接管理器。目前唯一失败的软件包运行了约 30 分钟。我没有使用 MSDTC,实际上也没有做任何交易;目前我们恢复失败。它在特定的数据流任务上始终失败,从行数(约 300 万行)的角度来看,这是最大的
-
值得注意的是,这个包运行了 30 分钟,访问了两台服务器上的两个不同的数据库,运行了 7 个不同的数据“实体”,顶层对象,它只传输了 300-500 行,然后图中最底部的对象是前面提到的约 300 万行表。
-
能否弹出出现故障的数据流任务的屏幕截图?
-
当然,谢谢@billinkc
标签: sql-server ado.net ssis oledb connection-timeout