SSIS如何管理关闭连接?我可以强行吗?

时间:2012-12-05 22:32:29

标签: sql-server ado.net ssis oledb connection-timeout

tl; dr version

在运行几夜后使用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 Sources而不是OLE DB Sources替换源节点。对于某些情况,这在我的数据流任务中是可以接受的,但是在我需要使用Lookup组件的情况下,或者只能使用OLE源的其他类似工具的情况下,如果我仍然会遇到这个问题,这不是一个足够好的解决方案这些问题。

问题:

我知道ADO.NET和OLE DB连接之间存在很多差异,但我注意到的一个主要问题是OLE DB连接管理器有两个超时,默认值为'0',这通常意味着禁用(没有超时)。 ADO.NET连接管理器只有一个超时,它的值设置为'15'(15秒)。

这两个连接管理器如何处理超时和关闭连接?在OLE DB连接管理器超时中值为0,除非在SQL Server上执行某些操作,否则该连接是否永远不会关闭?这可能是我的问题的一部分,有这么多的数据流任务打开OLE DB连接,然后没有被关闭?我可以在SSIS包中做些什么来强行关闭这些连接吗?

**** **** EDIT

以下是相关数据流任务的屏幕截图。我改变了一些名字来保护无辜者等等。

enter image description here

如图所示的任务将完全正常运行并且100%的时间都在工作。如果我将该ADO.NET源更改为OLE DB源我得到帖子中提到的错误。在其他一些情况下,我通过扩展源查询来完成并消除了Lookup。在这项任务中我没有。

1 个答案:

答案 0 :(得分:2)

我们发现了所有问题的根源以及问题描述与环境描述不符的原因,并且没有足够的线索可以解决。

最后一切都爆炸了,我们发现“网络或服务器上没有任何变化”并非如此。

我们的工作中间发生了备份。该备份使用卷影副本,并备份了生产数据库和tempdb。由于磁盘IO问题/锁定,tempdb由于未经编写的更改而增长到半个TB,然后进一步尝试进行阴影复制。

关闭tempdb和生产数据库上的备份/卷影副本会导致作业立即生效。正在进行的查询>现在30分钟< 1分钟。

谢谢你们坚持我并思考它。