我正在使用Windows 2008 R2,CPU处于100%。我在负责的应用程序池上运行DebugDiag并发现了以下调用堆栈:
System.GC._Collect(Int32, Int32)
OpenAccessRuntime.Relational.conn.RelationalConnectionPool.CleanupLeftOvers(System.Object)
System.Threading.ExecutionContext.runTryCode(System.Object)
System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode, CleanupCode, System.Object)
System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
System.Threading.ThreadPoolWorkQueue.Dispatch()
System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()
我的问题是我想知道产生这个线程的组件是什么,所以我知道这个线程是来自Telerik应用程序,还是它是由我们的一个开发人员创建的东西控制的。
如何确定产生此线程的对象?
答案 0 :(得分:2)
此线程由OpenAccess运行时生成。
OpenAccess维护一个具有可配置的“最大活动连接”值的连接池 - 默认值为10.当发出所有连接(并行操作)后,下一个请求将一直阻塞,直到活动连接返回池为止。如果请求被阻止,后台池管理线程会尝试强制执行垃圾收集以释放可能存在的任何悬空/无效连接。
您是否明确指定了最大活动值?也许您应该根据您的使用情况考虑更高的价值。你有没有访问'context.Connection'的地方而不处理它?</ p>