应用程序间歇性失败并出现一般 ODBC 错误。客户端应用程序正在使用 ODBC 连接到 SQL 集群。启用 ODBC 跟踪显示此错误:
StorageOnlineOp 46ec-44a8 ENTER SQLDriverConnectW
HDBC 0x012E2FD8
HWND 0x00000000
WCHAR * 0x6C228B34 [ -3] "******\ 0"
SWORD -3
WCHAR * 0x6C228B34
SWORD -3
SWORD * 0x00000000
UWORD 0 <SQL_DRIVER_NOPROMPT>
StorageOnlineOp 46ec-44a8 EXIT SQLDriverConnectW with return code -1 (SQL_ERROR)
HDBC 0x012E2FD8
HWND 0x00000000
WCHAR * 0x6C228B34 [ -3] "******\ 0"
SWORD -3
WCHAR * 0x6C228B34
SWORD -3
SWORD * 0x00000000
UWORD 0 <SQL_DRIVER_NOPROMPT>
DIAG [IM005] [Microsoft][ODBC Driver Manager] Driver's SQLAllocHandle on SQL_HANDLE_DBC failed (0)
根据微软的错误解释:
(DM) 在 SQLConnect 期间,驱动程序管理器使用 SQL_HANDLE_DBC 的 HandleType 调用驱动程序的 SQLAllocHandle 函数,并且驱动程序返回错误。
任何进一步缩小问题范围的推荐步骤?
根据 ODBC 日志版本信息为:
03.80.0000 = SQLGetInfoW (SQL_ODBC_VER) 03.52 = SQLGetInfoW (SQL_DRIVER_ODBC_VER)
在这种情况下,我将 ODBC 日志中的 StorageOnlineOp 链接到进程名称 StorageOnlineOpns.exe。发生问题时,我使用任务管理器右键单击进程和“创建转储文件”
分析显示该进程是一个 32 位进程,接近其 2GB 地址空间限制,并且无法为数据库连接分配内存。
在 WinDbg 中打开 dmp 文件,使用以下命令来识别问题:
这个进程是 32 位的,所以被限制为 2GB 地址空间,这几乎被耗尽了:
由于无法分配更多内存,数据库连接代码失败:
此外还有一个锁阻塞了 4 个线程。阻塞函数是一个堆函数。这在堆损坏问题中很常见。