网站更新,测试很好,部署后再次没问题,一旦用户负载增加,失败?

时间:2009-12-22 19:45:55

标签: sql-server asp.net-mvc linq-to-sql windows-server-2003

我们正在使用带有LINQ to SQL的ASP.NET MVC。我们在QA框中添加了一些功能并对其进行了全面测试。我们正在使用Windows Server 2003和SQL Server 2005.因此,当我们推出对Live Web服务器的更改时,我们还使用Red Gate SQL Compare将新的数据库更改推送到LIVE数据库。我们在少数人之间再次测试,没有问题。睡觉的时间。

早上来了,用户开始点击应用程序,然后是BOOM。我们不知道为什么会发生这种情况,因为我们还没有做过我们之前没做过的任何新类型的代码。但是我们注意到在SQL Compare同步期间,所有外键的名称在两个数据库之间是不同的,而不是表中的ID,FK_AssetAsset_A0EB67到FK_AssetAsset_B67EF8(例如,不记得尾随混合字符的确切数量SQL Compare),我们不确定为什么,但这是这个问题的另一个变量。

奇怪的是,一旦全部推出,我们就可以在QA上复制错误,但不会在所有内容被推送到LIVE之前。

QA和LIVE数据库位于同一个SQL Server上,但这些应用程序位于Windows Server 2003的不同实例上。

生成错误:

索引超出了数组的范围。

关闭阅读器时无法尝试调用FieldCount。

服务器无法恢复交易。

已经有一个与此命令关联的打开DataReader,必须先关闭它。

将请求发送到服务器时发生传输级别错误。

从服务器接收结果时发生传输级别错误。

读取器关闭时无效尝试调用Read。

关闭阅读器时无效尝试调用MetaData。

计数必须为正数,count必须引用字符串/数组/集合中的位置。参数名称:count

ExecuteReader需要一个开放且可用的连接。连接的当前状态是连接。

任何人都知道这可能发生了什么?


编辑:由于我们能够在QA上突然复制错误,因此可能不会出现用户加载问题......毋庸置疑,我们都觉得自己真的搞砸了。

2 个答案:

答案 0 :(得分:1)

并发总是会带来木工的错误。我建议您检查可以在请求(例如静态成员和单例)之间共享的对象,并重构代码,以便尽可能少地共享。

就细节而言,对于错误“已经有一个与此命令关联的开放DataReader必须先关闭”,您可能想尝试将MultipleActiveResultSets = True添加到连接字符串中。

答案 1 :(得分:0)

听起来你正在跨越一些流并尝试跨请求共享DataContexts。我的建议是连接一个依赖注入框架,为每个请求创建一个新的依赖实例。

我使用Castle的IoC并将其连接到控制器工厂,这样当它看到存储库的依赖时,它会为每个请求创建该存储库的新实例。如果你走这条路,请告诉我,我可以给你一些资源。