我遇到了一个问题,在使用 Microsoft 的活动模板库调用 SQL OLE DB CCommand< Taccessor, TRowset >::Open() 命令后,线程只是挂起并且永远不会返回。
这是调用的样子:
hr = CCommand< TAccessor, TRowset >::Open( DB::Instance()->GetSession(), CComBSTR(strCmd), pPropSet, pRowsAffected, DBGUID_DEFAULT, true, 0 );
CCommand<>::Open() 方法通过网络在 SQL Server 上执行存储过程。
我设法从 Process Explorer 捕获了堆栈跟踪,并只是寻找有关方向的任何线索或建议,以帮助弄清楚这里发生了什么。我在下面包含了堆栈跟踪:
ntoskrnl.exe!KeWaitForMultipleObjects+0xc0a
ntoskrnl.exe!KeAcquireSpinLockAtDpcLevel+0x732
ntoskrnl.exe!KeWaitForMutexObject+0x19f
ntoskrnl.exe!NtWaitForSingleObject+0xde
ntoskrnl.exe!KeSynchronizeExecution+0x3a23
wow64cpu.dll!TurboDispatchJumpAddressEnd+0x6c0
wow64cpu.dll!TurboDispatchJumpAddressEnd+0x4a8
wow64.dll!Wow64SystemServiceEx+0x1ce
wow64.dll!Wow64LdrpInitialize+0x429
ntdll.dll!RtlIsDosDeviceName_U+0x24c87
ntdll.dll!LdrInitializeThunk+0xe
ntdll.dll!ZwWaitForSingleObject+0x15
ntdll.dll!RtlIntegerToUnicodeString+0x20b
MSDART.DLL!?ConvertExclusiveToShared@CReaderWriterLock3AR@@QAEXXZ+0xb8
sqloledb.dll!DllUnregisterServer+0xa29b
sqloledb.dll!DllUnregisterServer+0xa05b
sqloledb.dll!DllUnregisterServer+0x9f70
sqloledb.dll+0x16e92
MyService.exe+0xea26a
这段代码多年来一直运行良好。这是一个 32 位 C++ 应用程序,使用 MS Visual Studio 2010 构建。在发生 2 次更改后我们开始遇到问题,不确定它是否相关,一个 32 位构建的应用程序现在第一次在 64 位 Windows 环境中运行时间..二、sql数据库不再是服务器本地的,而是跨网络的。
这是一个每分钟运行数百甚至数千个事务的大容量服务器,每隔几天或更长时间,它是非常随机的,代码将挂在完全相同的位置,与上面完全相同的堆栈跟踪..
真的很感激任何关于如何弄清楚 sqloledb 发生了什么的建议?
首先要开始的问题是为什么堆栈跟踪显示 sqloledb 正在调用 DllUnregisterServer?
从堆栈跟踪看来,sql ole db 正在等待以 WaitForMultipleObjects 作为最后一次调用的东西,但我怎样才能弄清楚它在等待什么?
谢谢你。