我怎样才能让我的应用程序池不再崩溃?
背景
多年来一切都运行良好,直到我将 Windows 10 Pro 更新到建议的更新Windows 功能体验包。
当前系统:
版本 Windows 10 Pro
版本 21H2
安装于 2020/8/24
操作系统内部版本 19044.1415
体验 Windows 功能体验包 120.2212.3920.0
这肯定改变了一些用户权限和 IIS 的工作方式;甚至导致我丢失了我的网站。我不得不重新安装一切。
错误 (C0000005)
我从 MariaDB 10.1 更新到 MariaDB 10.6 已经四周了,与此同时,我也从使用 MySQL ODBC 5.1 驱动程序改为使用 MariaDB Connector/ODBC 3.1(版本 3.01.15.00),它是“当前稳定版本系列“”。
这些不太有用的错误缺少错误所在的行号信息。它们显示为:
文件 /home.asp 意外错误。外部对象中发生可捕获错误 (C0000005)。脚本无法继续运行。
看起来像这样:
我做了什么:
我按照这篇文章的建议检查了我的代码是否与数据库保持了开放的连接经典 ASP C0000005 错误但我仍然收到这些错误。这些随机 (C0000005) ASP 错误不断导致应用程序池崩溃,并且行为与此主题这可能是由某些内存泄漏造成的。
现在我正在考虑使用不同的驱动程序。
本主题中的答案什么是 ASP 0115 和 C0000005 错误建议使用 2009 年的 ODBC 连接器版本 5.1.6 (mysql-connector-odbc-5.1.6-winx64.msi)。MySQL 连接器/ODBC 8.0.27(mysql-connector-odbc-8.0.27-winx64.msi) 看起来更新了。我应该试一试。
我注意到的第一件事是它快了很多。现在我只希望这些 C0000005 错误能够结束。
更新A:错误仍然会出现,但比预期的要快得多。
我尝试过32 位驱动程序以及 mysql-connector-odbc-8.0.27-win32.msi 看看是否可以工作,但甚至无法加载页面。我想我需要使用 32 位应用程序池才能工作。(还没有尝试过。)
更新B:我现在又开始使用64 位 MySQL 连接器/ODBC 8.0.27司机。
可能是我配置驱动程序的方式导致我的应用程序池崩溃了?
这是我的连接字符串:
Conn_STRING = "dsn=___;" & _
"TCPIP=1;" & _
"SERVER=127.0.0.1;" & _
"UID=___;" & _
"PWD=___;" & _
"DATABASE=___;" & _
"PORT=3306;" & _
"CONN_TIMEOUT=30;" & _
"CHARSET=utf8mb4;" & _
"READ_TIMEOUT=20;" & _
"WRITE_TIMEOUT=10;" & _
"Option=3"
我这样设置连接参数:
我注意到,尽管存在这些记录的错误,应用程序池仍然以某种方式继续运行:
- <Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
- <System>
<Provider Name="Active Server Pages" />
<EventID Qualifiers="49152">5</EventID>
<Version>0</Version>
<Level>2</Level>
<Task>0</Task>
<Opcode>0</Opcode>
<Keywords>0x80000000000000</Keywords>
<TimeCreated SystemTime="2021-12-23T21:41:37.9772561Z" />
<EventRecordID>2212200</EventRecordID>
<Correlation />
<Execution ProcessID="0" ThreadID="0" />
<Channel>Application</Channel>
<Computer>vm-white</Computer>
<Security />
</System>
- <EventData>
<Data>File /blog.asp Unexpected error. A trappable error (C0000005) occurred in an external object. The script cannot continue running.</Data>
</EventData>
</Event>
我还在系统日志中看到一个新的警告。
更新
我尝试过许多不同的 ODBC 驱动程序。MariaDB ODBC 和 MySQL ODBC 驱动程序。没有一个可以防止应用程序池崩溃。在崩溃之前,会记录大量 C0000005 错误。MySQL ODBC 8.0 驱动程序速度更快,容错性更强,但仍有一些东西会导致应用程序池崩溃。我现在使用的是 MySQL ODBC 8.0 Unicode 驱动程序。
此外,我现在改变了设置对象的方式。而不是像这样设置它们
SET rs = Server.CreateObject("ADODB.Recordset")
SET wshell = Server.CreateObject("WScript.Shell")
SET message = Server.CreateObject("CDO.Message")
我现在正在做
SET rs = CreateObject("ADODB.Recordset")
SET wshell = CreateObject("WScript.Shell")
SET message = CreateObject("CDO.Message")
它看起来越来越有希望了。一些错误现在有时会有行号。
我联系了微软来帮助我解释我的 DebugDiag 分析报告这些崩溃。我还注意到错误日志中开始出现一种新模式。首先是活动服务器页面其次是应用程序错误:
Active Server Pages 错误:
错误:文件 /blog.asp 意外错误。外部对象中发生可捕获错误 (C0000005)。脚本无法继续运行。
应用程序错误:
错误应用程序名称:w3wp.exe,版本:10.0.19041.1,时间戳:0x58c67bf3
错误模块名称:ntdll.dll,版本:10.0.19041.1288,时间戳:0xa280d1d6
异常代码:0xc0000409
故障偏移量:0x00000000000a2070
错误进程 ID:0x3144
错误应用程序启动时间:0x01d7fd9d0686ef42
错误应用程序路径:c:\windows\system32\inetsrv\w3wp.exe
错误模块路径:C:\WINDOWS\SYSTEM32\ntdll.dll
报告 ID:cda5aa10-492d-4e5c-ae17-ac4f9dbf70ab
故障软件包全名:错误软件包相关应用程序 ID:
根据建议这里在 mysql.com 上,我现在更改了 DSN 连接器设置以用于 ASP。我选中了复选框Return matched rows instead of effected rows
。
我Option=3
在连接字符串中发现这个博客我应该将其声明为FLAG_FIELD_LENGTH
(1)+ FLAG_FOUND_ROWS
(2)。
欢迎任何建议。
答案1
最终发现是数据库驱动程序导致了问题。使用MySQL ODBC 8.0 Unicode Driver
有效的方法。
...使用它来连接它:
MM_Connection_STRING = "DRIVER={MySQL ODBC 8.0 Unicode Driver};" & _
"PORT=_;" & _
"SERVER=127.0.0.1;" & _
"UID=_;" & _
"PWD=_;" & _
"DATABASE=_;" & _
"Option=3;" & _
"CHARSET=utf8mb4"
ChatGTP 提供的深刻见解
一般而言,对于 Classic ASP 应用程序,使用 ODBC 连接器可能是最直接且得到广泛支持的选择,因为 Classic ASP 旨在与 ADO 配合使用。但是,如果您要处理涉及 Classic ASP 和 .NET 的混合技术堆栈,则可能需要根据您的特定要求考虑连接器组合。