如果你的packages在执行的过程中有没有被捕获到的异常,则sqldumper会跳出来获取这些异常信息输出,存在下面的目录中:

C:\Program Files\Microsoft SQL Server\110\Shared\ErrorDumps

文件有以.tmp和mdmp结尾.

SQLDUMPER_ERRORLOG.log

通常这个时候整个package就会被hang住,如果你使用Dtsdebughost.exe(即在VS)中测试时,

如果你直接使用dtexec.exe来操作,可能dtexec就已经崩溃了.stop working.

我的包中使用到了多线程进行数据加载,如果线程中出现了异常,package会在测试时hang住,所以我就进行了下面的测试.

我在Package中使用了一个scripttask,new 了三个线程执行一些简单的测试操作.

我特意让子线程抛出一些测试异常,我们在主线程中无法捕获这些子线程抛出的异常.

但是我使用appdomain.currentdomain.unhandleexception方法来捕获处理这些异常.

第一次测试的结果是:

sqldumper跳出来,然后pacakge就一直running,SSDT中显示包已经执行完成.但是其onPostExecute事件并未被执行.

从processinginfo中可以看到unhandleexception绑定的事件处理方法已经执行了.

界面中一直hang住的情况,我分析是有些线程没有被中止

然后我就开始了第二次尝试,

在处理未捕获异常的事件处理方法中加入处理线程的方法,我让每一个线程在启动前都加入一个list<thread>对象.

处理的时候,先捕获异常信息,然后输出线程的状态,最后abort线程.我发现task顺利完成了.

第三次测试,我在Package的OnQueryCancel中加入一个scriptask,但其中故意生成一个异常,scripttask也会被hang住,

因为我发现在package的执行过程中,onquerycancel事件会被不定期触发,只要我们的System::Cancel变量是false.

在bookonline上查找相关onquercancel的说明,它会不定期触发,你可以通过设置system::cancel变量的值通知它停止运行,它给了你这样的一个机会,终止任务的执行.

我想到了MSDN论坛上有一个人问题的问题,他说如果package的执行时长超过10分钟,就需要它自动停止,其实就可以使用类似这样的方法,如果package执行时长超过10分钟,就把它的System::Cancel值置为true即可.

在package中的代码如下:

 bool isreuse = false;List<Thread> _listworkthreads = new List<Thread>();object internalsyncobj = new object();/// <summary>/// This method is called when this script task executes in the control flow./// Before returning from this method, set the value of Dts.TaskResult to indicate success or failure./// To open Help, press F1./// </summary>public void Main(){// TODO: Add your code hereAppDomain.CurrentDomain.UnhandledException += HandleException;Dts.TaskResult = (int)ScriptResults.Success;string mymsg = "thread :" + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString()+ " domainid:"+ System.Threading.Thread.GetDomainID().ToString();Dts.Events.FireInformation(0, "showmsg", mymsg, "", 0, ref isreuse);int times = 0;bool isused = false;while (times < 300){times++;Dts.Events.FireInformation(0, "showmsg", times.ToString(), "", 0, ref isreuse);if (times == 9 && !isused){Dts.Events.FireInformation(0, "showmsg", "update var_threadcount to 2", "", 0, ref isreuse);Dts.Variables["var_threadcount"].Value = 2;//try { Dts.VariableDispenser.Reset(); }catch { }isused = true;}}runNewThread("test");Thread th = new Thread(obj =>{throw new Exception("hello exception in thread");});lock (internalsyncobj) { _listworkthreads.Add(th); }th.Start();System.Threading.Thread.Sleep(6 * 1000);}void runNewThread(string msg){Thread th = new Thread(obj =>{Dts.Events.FireInformation(0, "showmsg", msg, "", 0, ref isreuse);string mymsg = "thread :" + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString()+ " domainid:"+ System.Threading.Thread.GetDomainID().ToString();Dts.Events.FireInformation(0, "showmsg", mymsg, "", 0, ref isreuse);Thread t = new Thread(() =>{throw new Exception("hello exception in child thread!");});lock (internalsyncobj) { _listworkthreads.Add(t); }t.Start();});lock (internalsyncobj) { _listworkthreads.Add(th); }th.Start(msg);}void HandleException(object sender, UnhandledExceptionEventArgs e){Dts.Events.FireInformation(0, "UnhandleException", "sender:" + sender.ToString() +"message:" + ((Exception)e.ExceptionObject).Message, "", 0, ref isreuse);//handle child threadlock (internalsyncobj){Dts.Events.FireInformation(0,"AppdomainUnhandleException", "thread count:" + _listworkthreads.Count.ToString()+ " start to kill all child thread at time:" + DateTime.Now.ToString(), "", 0, ref isreuse);foreach (Thread th in _listworkthreads){Dts.Events.FireInformation(0, "ThreadState", "thread state:" + th.ThreadState.ToString()+ DateTime.Now.ToString(), "", 0, ref isreuse);try {th.Abort(); }catch (Exception ex) { }}}}

View Code

转载于:https://www.cnblogs.com/huaxiaoyao/p/3738088.html

SSIS hang with unhandle exception相关推荐

  1. ssis面试题_SSIS面试问题

    ssis面试题 These SSIS interview questions cover many of the top topics that you will be asked when appl ...

  2. ssis组件_SSIS脚本组件概述

    ssis组件 SSIS Script component is a prominent strength of SQL Server Integration Services since it all ...

  3. 现代软件工程系列 学生的精彩文章 (2) 到底是谁的 bug?

    http://teamkingofcsharp.spaces.live.com/blog/cns!59FC2D3DD66822AA!406.entry 又见M$的bug 发信人: Dora9 (Dor ...

  4. python自定义全局异常_如何在python中进行全局异常捕获

    使用sys.excepthook函数进行全局异常的获取. 首先定义异常处理函数, 并使用该函数接收系统异常信息. import wx import sys class TestFrame(wx.Fra ...

  5. Android挂断电话流程

    近期在友盟上看到许多关于挂断电话导致崩溃的问题,如下异常 java.lang.NoSuchMethodError: No interface method endCall()Z in class Lc ...

  6. Oracle 学习笔记,,,经验总结整理的。。。

    cmd进入: 1. D:\oracle\ora92\bin> 2. sqlplus /nolog 3. conn sys/sys as sysdba sqlplus进入: username:sy ...

  7. 教学管理系统——利用java和mysql来实现

    利用java和mysql实现教学管理系统.教学管理系统主要是在eclipse利用java代码完成编写,并与数据库进行连接,使得两边都能控制数据库的数据变化.仅供初学者参考. 每学期学校都要开设-定的课 ...

  8. c#直接调用ssis包实现Sql Server的数据导入功能

    调用ssis包实现Sql Server的数据导入功能网上已经有很多人讨论过,自己参考后也动手实现了一下,上一次笔者的项目中还用了一下这个功能.思前想后,决定还是贴一下增强记忆,高手请54. 1.直接调 ...

  9. Java 处理 Exception 的 9 个最佳实践!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 在Java中处理异常并不是一个简单的事情.不仅仅初学者很难理解,即 ...

最新文章

  1. centos下docker1.7 上传文件到容器报错 Error: Path not specified
  2. C++(STL):05---智能指针之unique_ptr
  3. php 异步处理类,php异步处理类
  4. Java基础---键盘录入工具(Scanner类)
  5. 【分治】动态点分治 ([ZJOI2007]捉迷藏)
  6. opengl 矩阵投影代码 shade_LookAt、Viewport、Perspective矩阵
  7. java中UUID类生成32位随机数(附加 6 位随机数)
  8. android模拟器横屏显示,安卓模拟器bluestacks怎么横屏显示
  9. 2020年营收仅62.5万,九城凭什么砸1亿美金购买矿机?
  10. 无权图的单源最短路径
  11. lua的userdata的生存周期
  12. 想知道体感游戏的类型有哪些吗?我来告诉你
  13. JavaScript高级编程语言基础语法
  14. java ema算法_K线图指标算法(MA EMA)
  15. 科技云报道:元宇宙如何切入办公场景?云桌面或是必经之路
  16. 抽象工厂模式(图画版)
  17. js小玩意(三)从数组中找到指定元素并删除
  18. shopping更任性,不止有淘宝,还有智慧商场!
  19. 北京工业大学 C语言课设
  20. Github资源汇总

热门文章

  1. 机器学习(六)支持向量机svm初级篇
  2. Convolutional Sequence to Sequence Learning笔记
  3. linux git 发邮件,gitlab发邮件基于sendmail
  4. android 自定义横向堆积柱形图,MPAndroidChart项目实战(八)——自定义分段堆积柱状图...
  5. linux yum选择版本mysql_linux yum安装指定版本mysql
  6. linux几种常见的文件内容查找和替换命令
  7. java socket 异步回调函数,分享nodejs异步编程基础之回调函数用法
  8. 如何关闭小娜进程_Python多进程之进程间通信 - Pipe amp; Queue
  9. 网络安全人才平均年薪 24.09 万,跳槽周期 31 个月,安全工程师现状大曝光!
  10. Python学习入门2:Python学习路线(课程大纲+Python视频教程+下载地址)