我遇到了我正在维护的经典ASP应用程序的问题(架构师早已不复存在)。每个客户站点都会获得一个与其数据库名称相对应的虚拟目录 - 例如,http://www.site.com/Foo将是客户Foo的站点,其数据库也将命名为Foo。 1:1映射,非常清晰。
我们说还有http://www.site.com/Bar。我至少在中等负载下偶尔会遇到的错误是对/ Bar的POST请求被保存在/ Foo数据库中。
值得注意的是,保存操作已转移到使用Server.CreateObject调用实例化的.NET组件。此.NET类实例使用
System.EnterpriseServices.ContextUtil.GetNamedProperty("Request");来获取当前请求的句柄。 .NET代码根据此请求构建有关保存操作的所有内容。
我的工作理论是,不知何故,System.EnterpriseServices.ContextUtil和创建.NET组件的.asp页面对当前请求的含义有不同的看法。这可能吗?我似乎认为请求是一次处理一个,但我似乎无法找到明确的答案。
我已经尝试将所有虚拟目录放入一个应用程序池中,并且每个客户都有自己的 - 这个问题都出现了。
我唯一的另一个想法是,某种程度上数据库连接池项目被错误地重用,但数据库连接是使用数据库名称创建的,作为 连接字符串,所以我发现这是极不可能的。
服务器正在运行IIS 6,数据库服务器是SQL Server 2000.升级计划已在进行中。
答案 0 :(得分:0)
我认为答案会在Request对象本身的某个地方。或者是否可能在.NET代码中有一个Case / If基本上默认为Foo?例如,是否存在可能从网络服务器的根目录运行的所有应用程序共有的代码...或者至少认为它是从那里运行的?
我认为你真的需要得到一个例子,说明何时不同并做一些比较。我的猜测是,这个问题不那么“片面”,而且更具系统性......关键是找到情景并从那里开始。但是如果没有我们的确切实例,就很难就这样的事情提出具体建议。
答案 1 :(得分:0)
这似乎是数据库连接池问题。
我们很难确定这个错误,一行数据进入错误的数据库,只会在一种情况下发生:
当这些请求相隔几毫秒时,我们就会看到错误。
我们重构了代码以减少每个循环执行的插入次数,这大大减少了此错误的发生次数,尽管我们仍然很少看到它。