SSIS hang with unhandle exception

如果你的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 here
AppDomain.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 thread
lock (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) { }
}
}

}

SSIS hang with unhandle exception

时间: 2024-11-05 22:06:56

SSIS hang with unhandle exception的相关文章

解决“unhandle exception ... MFCO42D.DLL”问题

在用MFC编程时,有时会遇到如下情况: 图(1) Unhandled exception MFCO42D.DLL 出现该问题的原因是:没有把工程设置为"Use MFC in a Static Library". 解决方法: 1)点击VC6.0工具栏上的[Project] –> Setting –> 在General选项卡:选择"Use MFC in a Shared DLL" –> OK,如图(2)所示: 图(2)在Project Setting里

Java中的异常处理机制

Java中的异常处理机制 示例 public class test { public static void main(String[] args) { // TODO Auto-generated method stub String s="hello"; int i=Integer.parseInt(s); } } 运行异常结果 在上述代码中Integer.parseInt表示把字符串类型转化成整数类型,同时Integer是Int的封装类:程序会报错,因为计算机没有办法把hello

SSIS动态删除分区

在前面两篇博客中,介绍了动态分区(按照月份)和动态执行分区(每天 执行),但是在实际项目中会有问题:我们分区的CUBE是每天要执行的,但是动态分区每天不会重新生成! 脚本任务中的这段代码,决定了存在的分区将不会执行,造成数据缺失. //如果分区存在将返回false,不在生成分区,如果是3月1号执行的动态生成分区SSIS包,那么以后的3月数据都将加载不进来 if (aMeasureGroup.Partitions.Contains(sPartition)) { Dts.Variables["Use

数据库高手(DBA专家 ,SSIS,replacation ,tourble shooting)

http://www.cnblogs.com/qanholas/category/266780.html 随笔分类 - mssql SQL Server 2008 Datetime Cast 成 Date 类型可以使用索引(转载) 摘要: 很久没写blog,不是懒,实在是最近我这的访问速度不好,用firefox经常上传不了图片 .......今天无意发现了SQL Server 2008 Datetime Cast 成 Date 类型可以使用索引,分享一下:测试环境:USETEMPDBGOCREA

【翻译自mos文章】当指定asm disk 为FRA时,11.2.0.3的dbua hang住

当指定asm disk 为FRA时.11.2.0.3的dbua hang住 来源于: 11.2.0.3 DBUA Hangs While Specifying ASM Disk To FRA (文档 ID 1427179.1) 适用于: Oracle Database Upgrade Assistant - Version 10.2.0.1 and later Oracle Server - Standard Edition - Version 10.2.0.1 and later Oracle

效率最高的Excel数据导入---(c#调用SSIS Package将数据库数据导入到Excel文件中【附源代码下载】) 转

效率最高的Excel数据导入---(c#调用SSIS Package将数据库数据导入到Excel文件中[附源代码下载])  本文目录: (一)背景 (二)数据库数据导入到Excel的方法比较   (三)SSIS的简介   (四)数据库中存储过程示例(SSIS应用需要) (五)Excel模板的制作(这步这么简单,稍微介绍一下)   (六)SSIS操作过程(生成Package,用来调用)(下一篇随笔将详细讲解制作Package包的过程,图片太多,篇幅过长,因此本文将直接采用生成的Package包进行

SSIS添加分区-动态

主要参考:动态分区 一.前提准备: 1.一个日期存储过程,注意代码可以得到一个月中的最后一天,最终生成时间维度. USE [DrugDW] GO /****** Object: StoredProcedure [dbo].[PROC_DATETIME] Script Date: 2/28 星期二 14:16:46 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER PROCEDURE [dbo].[PROC_DATETIM

微软BI 之SSIS 系列 - 使用 Script Task 访问非 Windows 验证下的 SMTP 服务器发送邮件

开篇介绍 大多数情况下我们的 SSIS 包都会配置在 SQL Agent Job 中周期性的按计划执行,比如每天晚上调用 SSIS 包刷新数据,处理 Cube 等.一旦 SSIS 包中出现任何异常,报错,那么配置在 SQL Agent Job 中的通知,邮件提醒就会把这些错误信息发邮件到指定的用户或者系统维护者,这样就起到了一个错误监控的作用. 但是在有的情况下,有一些自定义的 SSIS 调度框架的计划调度都不是通过 SQL Agent Job 配置来完成的.比如我以前在一个小项目中设计过一个

SSIS 学习之旅 FTP访问类

这章把脚本任务访问FTP的方法 全部给大家. 控件的使用大家如果有不懂得可以看下我之前的文章.第一章:SSIS 学习之旅 第一个SSIS 示例(一)(上) 第二章:SSIS 学习之旅 第一个SSIS 示例(二) 第三章:SSIS 学习之旅 数据同步 第四章:SSIS 学习之旅 FTP文件传输-FTP任务 第五章:SSIS 学习之旅 FTP文件传输-脚本任务 #region 连接FTP服务器 /// <summary> /// 连接FTP服务器 /// </summary> ///