在线程中用 OracleBulkCopy 导至 CPU 百分百
         private void BulkCopy(string connStr, DataTable dt, string tblName) {
             ) {
                 using (var bc = new OracleBulkCopy(connStr)) {
                     bc.DestinationTableName = tblName;
                     foreach (DataColumn col in dt.Columns) {
                         bc.ColumnMappings.Add(col.ColumnName, col.ColumnName);
                     }
                     bc.WriteToServer(dt);
                 }
             }
         }
connStr 是 ORACLE 的连接字符串, tblName 是目标表的表名.
        /// <summary>
         /// 将 List 转换为 DataTable, 只针对 T 中 的 public Property
         /// </summary>
         /// <typeparam name="T"></typeparam>
         /// <param name="list"></param>
         public static DataTable ToDataTable<T>(this List<T> list) where T : class {
             if (list == null)
                 return null; 
             Type type = typeof(T);
             var ps = type.GetProperties().Where(p => p.CanWrite && (p.PropertyType.IsValueType || p.PropertyType.IsPrimitive || p.PropertyType == typeof(String)));
             Type targetType;
             NullableConverter nullableConvert;
             List<DataColumn> cols = new List<DataColumn>();
             foreach (var p in ps) {
                 if (p.PropertyType.IsGenericType && p.PropertyType.GetGenericTypeDefinition().Equals(typeof(Nullable<>))) {
                     nullableConvert = new NullableConverter(p.PropertyType);
                     targetType = nullableConvert.UnderlyingType;
                     cols.Add(new DataColumn(p.Name, targetType));
                 } else {
                     cols.Add(new DataColumn(p.Name, p.PropertyType));
                 }
             } 
             DataTable dt = new DataTable();
             dt.Columns.AddRange(cols.ToArray()); 
             list.ForEach((l) => {
                 List<object> objs = new List<object>();
                 objs.AddRange(ps.Select(p => p.GetValue(l, null)));
                 dt.Rows.Add(objs.ToArray());
             }); 
             return dt;
         } 
生成DUMP文件, 用 WinDbg 查看:
0:000> .load sos.dll 0:000> !threadpool CPU utilization: 96% Worker Thread: Total: 0 Running: 0 Idle: 0 MaxLimit: 32767 MinLimit: 3 Work Request in Queue: 0 -------------------------------------- Number of Timers: 0 -------------------------------------- Completion Port Thread:Total: 1 Free: 1 MaxFree: 6 CurrentLimit: 1 MaxLimit: 1000 MinLimit: 3
CPU 使用率 96%
杳看线程执行时间:
0:000> !runaway User Mode Time Thread Time 21:13dc 0 days 0:39:58.140 24:13d4 0 days 0:08:41.750 27:11ac 0 days 0:01:29.906 5:1250 0 days 0:00:18.796
查看21号线程的堆栈:
~21s !clrstack OS Thread Id: 0x13dc (21) Child SP IP Call Site 000000002595e7f8 00000000777e85d7 [HelperMethodFrame: 000000002595e7f8] 000000002595e910 000007fe9482b688 *** ERROR: Module load completed but symbols could not be loaded for Oracle.DataAccess.dll Oracle.DataAccess.Client.OracleTuningAgent.DoScan() 000000002595e950 000007fe9481d28f Oracle.DataAccess.Client.OracleTuningAgent.TuningFunction() 000000002595e9c0 000007fef0bdd0b5 *** WARNING: Unable to verify checksum for mscorlib.ni.dll System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) 000000002595eb20 000007fef0bdce19 System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) 000000002595eb50 000007fef0bdcdd7 System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object) 000000002595eba0 000007fef0b50301 System.Threading.ThreadHelper.ThreadStart() 000000002595eeb8 000007fef1c7ffe3 [GCFrame: 000000002595eeb8] 000000002595f1e8 000007fef1c7ffe3 [DebuggerU2MCatchHandlerFrame: 000000002595f1e8] 000000002595f3c8 000007fef1c7ffe3 [ContextTransitionFrame: 000000002595f3c8] 000000002595f5b8 000007fef1c7ffe3 [DebuggerU2MCatchHandlerFrame: 000000002595f5b8]
接连查了几个线程的堆栈, 都是这个: 
Oracle.DataAccess.Client.OracleTuningAgent.XXX
搜了一下 Oracle.DataAccess.Client.OracleTuningAgent.TuningFunction : 
http://stackoverflow.com/questions/2782169/oracle-data-provider-pegs-iis-worker-process-when-web-site-is-stopped
This has been fixed in 11.2.0.2 and in Patch 9966926 ORACLE 11G 11.2.0.1 PATCH 5 BUG FOR WINDOWS (64-BIT AMD64 AND INTEL EM64T).
Or WORKAROUND: is to disable self tuning by adding "Self Tuning=false" to the connection string.
看不大懂, 但是里面提及了 Oracle.DataAccess.Client 的版本. 
这个DLL 我是从客户端: 11.2.0 中考出来的, 版本是: 2.112.1.0

在线程中用 OracleBulkCopy 导至 CPU 百分百的更多相关文章
- redis-server进程CPU百分百问题
		
结论:待确认是否为redis的BUG,原因是进程实际占用的内存远小于配置的最大内存,所以不会是内存不够需要淘汰.CPU百分百redis-server进程集群状态:slave临时解决办法:使用gdb将d ...
 - 线程池大小设置,CPU的核心数、线程数的关系和区别,同步与堵塞完全是两码事
		
线程池应该设置多少线程合适,怎么样估算出来.最近接触到一些相关资料,现作如下总结. 最开始接触线程池的时候,没有想到就仅仅是设置一个线程池的大小居然还有这么多的学问,汗颜啊. 首先,需要考虑到线程池所 ...
 - linux 将进程或者线程绑定到指定的cpu上
		
基本概念 cpu亲和性(affinity) CPU的亲和性, 就是进程要在指定的 CPU 上尽量长时间地运行而不被迁移到其他处理器,也称为CPU关联性:再简单的点的描述就将指定的进程或线程绑定到相应的 ...
 - 面试官:CPU百分百!给你一分钟,怎么排查?有几种方法?
		
Part0 遇到了故障怎么办? 在生产上,我们会遇到各种各样的故障,遇到了故障怎么办? 不要慌,只有冷静才是解决故障的利器. 下面以一个例子为例,在生产中碰到了CPU 100%的问题怎么办? 在生产中 ...
 - 进程、线程、协程、CPU
		
进程.线程.CPU 进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.或者说进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进 ...
 - mysql连接卡死,很多线程sleep状态,导致CPU中mysqld占用率极高
		
关闭所有 .................................. .连接: ##把全部的MySQL连接kill掉for i in $(mysql -uroot -p123456 -Bse ...
 - REdis CPU百分百问题分析
		
REdis版本:4.0.9 运行环境:Linux 3.10.107 x86_64 gcc_version:4.8.5 结论:是一个BUG,在4.0.11版本中被作者antirez所修复 现象: 1) ...
 - 使用脚本快速线程转储及列出高cpu线程
		
jstack `ps -ef | grep java | grep bocai.jar | awk '{print $2}'` > cpu_high.logtop -b -n1 -Hp `ps ...
 - linux进程、线程与cpu的亲和性(affinity)
		
参考:http://www.cnblogs.com/wenqiang/p/6049978.html 最近的工作中对性能的要求比较高,下面简单做一下总结: 一.什么是cpu亲和性(affinity) C ...
 
随机推荐
- magic_quotes_gpc
			
ini里面有这个magic_quotes_gpc设置,是为了防止忘记处理而和mysql有冲突,引起mysql的风险,于是,认为的加上\slash,但是我们在Php中获得值的时候,需要判断如果这个值为1 ...
 - 手机号 和 email 的正则匹配
			
手机号 /^1[3|4|5|8] \d{9}$/ email /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((\.[a-zA-Z0-9_-]{2,3}){1,2})$/
 - IIS6.0开启gzip压缩(来自百度)
			
IIS6.0开启gzip压缩 | 更新:2012-08-10 10:29 1 2 3 4 5 分步阅读 开启gzip可以极大的加速网站.有时压缩比率高达80%,近来测试了一下,最少都有40%以上,还是 ...
 - winform   app.config文件的动态配置
			
获取 获取应用程序exe.config文件中 节点value值 /// <summary> /// 功能: 读取应用程序exe.config文件中 /// appSettings节点下 ...
 - TCP && UDP
			
TCP(Transmission Control Protocol,传输控制协议) 是面向连接的协议,也就是说,在收发数据前,必须和对方建立可靠的连接. TCP建立连接要进行3次握手,而断开连接要进行 ...
 - 介绍开源的.net通信框架NetworkComms框架之二  传递类
			
原文网址: http://www.cnblogs.com/csdev Networkcomms 是一款C# 语言编写的TCP/UDP通信框架 作者是英国人 以前是收费的 目前作者已经开源 开源地 ...
 - JavaEE SSH框架整合(四) 日志处理Spring结合 log4j、slf4j [转]
			
1. 加入log4j和slf4j的jar包 2. web.xml: <context-param> <!--log4j配置地址 --> <param-name>lo ...
 - MVC、ORM、CURD、ActiveRecord、单一入口的概念
			
MVC MVC是一个设计模式,它强制性的使应用程序的输入.处理和输出分开.使用MVC应用程序被分成三个核心部件:模型(M).视图(V).控制器(C),它们各自处理自己的任务. 视图 :视图是用户看到并 ...
 - iOS开发拓展篇—音频处理(音乐播放器3)
			
iOS开发拓展篇—音频处理(音乐播放器3) 说明:这篇文章主要介绍音频工具类和播放工具类的封装. 一.控制器间数据传递 1.两个控制器之间数据的传递 第一种方法:self.parentViewCont ...
 - NodeJs和ReactJs单元测试工具——Jest
			
Jest——Painless JavaScript UnitTesting 特点 适应性强 默认使用Jasmine断言 模块化的 可扩展的 可配置的 沙箱式且快速 虚拟化JS环境,模拟浏览器 并行运行 ...