微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

通过代码创建和执行的SSIS包需要多次运行后才能重新启动服务

如何解决通过代码创建和执行的SSIS包需要多次运行后才能重新启动服务

我们拥有现有的C#代码,可动态创建从不同文件读取并进入sql Server 2016数据库的SSIS包。它完成了我们需要的操作,但是遇到了一个我们仍然无法解决的问题:无法继续运行.Execute命令,而不必重新启动我们的自定义Windows服务。

现在限制为2个文件。如果我们第三次运行调用Execute命令的代码,它将基于我们通过Component和Run Event处理程序记录的内容而被困在post validate上,直到重新启动Windows服务和再次运行。我们不能总是重启服务,因为如果采用这种方法,可能还会破坏其他进程。

到目前为止我们已经尝试过的事情:

  1. 解压缩代码创建的dtsx包,并尝试在本地使用dtexec或BIDS运行它。没有错误/警告,我们可以不断地重复运行相同的程序包。
  2. 在本地运行相同的代码。与#1相同。
  3. 在我们的DBA的帮助下运行sql跟踪。确认我们没有锁定目标表和数据库本身的查询。我们确实观察到第三次运行后保留了一些SPID,但所有SPID都处于睡眠状态。
  4. 修改我们的RunEventHandler和ComponentEventHandler以记录该过程在哪一步。还尝试通过事件查看器启用记录。没有错误,实际上只是像前面提到的那样卡在验证后,第三次运行。
  5. 显式调用SSIS的dispose方法,甚至尝试显式地布置连接管理器本身。
  6. 播放DelayValidations和ValidateExternalMetadata属性

是否有其他人以前遇到过这种情况,并且能够弄清是什么原因造成的?

解决方法

为了阐明最新评论,我们发现问题出在我们调用一个单独的AppDomain来照顾运行任务并因此执行程序包这一事实。创建此单独的AppDomain的方式是通过CreateInstanceAndUnwrap使用以下代码:

private AppDomain CreateAppDomain(string applicationName)
    {
        var uid = Guid.NewGuid();
        var fi = new FileInfo(Assembly.GetExecutingAssembly().Location);
        var info = new AppDomainSetup
        {
            ConfigurationFile = @"D:\Deploy\App\web.config",ApplicationBase = @"D:\Deploy\App",ApplicationName = applicationName,CachePath = fi.Directory.Parent.FullName + @"\Temp",ShadowCopyDirectories = @"D:\Deploy\App\bin",PrivateBinPath = "bin",ShadowCopyFiles = "true"
        };

        var domain = AppDomain.CreateDomain(uid.ToString(),null,info);
        return domain;
    }

我们如何通过针对创建的域调用AppDomain.Unload(domain)来验证这一理论,并且当我们获得DomainUnloadException时,这确实防止了作业运行两次后冻结。

我们仍然无法确切确定域中哪些内容已被锁定并阻止我们多次执行该工作,因此,了解更多有关该方面的指导将有所帮助。同时,我们目前正在使用这种解决方法来卸载应用程序域。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。