11

只是想由大家运行一下,看看是否有任何好的想法,因为经过一整天、一夜和一早的搜索,我已经用尽了所有的想法。在并发使用(selenium 测试)时,我们遇到的问题总是围绕数据库连接,例如超时、断开/关闭的连接、无法访问数据库服务器。

这个问题似乎仅限于 Azure,因为即使在指向同一个数据库(SQL Azure)的相同代码上运行相同的硒测试时,我们还没有在本地遇到这个问题,所以它会指出它是出站的一些问题SQL Azure 中的数据库连接。到目前为止,我们已经尝试了以下方法:

  1. Azure 瞬态故障处理——当 SQL Azure 服务本身出现临时问题时,我们有重试逻辑。
  2. 更改通信协议——我们已经尝试过 TCP 和命名管道,但我们都遇到了同样的问题。
  3. 调整数据库连接超时间隔——我们尝试增加此时间无济于事。
  4. 添加多个活动结果集 – 我们已将其添加到连接字符串中,但无济于事。
  5. 检查每个查询的连接状态——当我们返回 DataContext 时,我们检查它的连接并在必要时重新打开。
  6. 关闭连接池 - 我们也尝试过,但没有成功。
  7. 改变了设计模式——我们甚至不遗余力地实现了工作单元设计模式,在每个工作单元之后都会启动和处理数据库连接,但这会在其他地方引起延迟加载、将对象传递给方法等问题在这一点上,这将是一个太大的返工。

  8. 更改角色大小——我想尝试的最后一件事是在 Windows Azure 中存在任何隐式连接限制的情况下增加角色大小——目前正在部署,所以它仍有一半可能起作用!

网站基础设施如下:

  • DataContext 类(扩展 DbContext),它是 Code First EF 上下文。
  • BusinessLayer 类包含一个私有的、非静态的 DataContext。DataContext 是注入每个 Manager/Helper 类的构造函数。
  • BusinessLayerService 类包含一个公共的、线程静态的 BusinessLayer 实例。
  • MVC 站点使用 BusinessLayerService.Instance 访问管理器类,这些管理器类查询和更新它们已传递的 DataContext。

任何帮助将不胜感激。

更新:我们将 VM 大小提高到中,它所做的只是意味着同样的问题需要更长的时间才能发生。

当问题开始发生时,一名团队成员注意到发生了以下异常:

InvalidOperationException:执行命令需要打开且可用的连接。连接的当前状态已断开。

每当数据库被击中时,这种情况就开始发生(不是特定于某个代码区域)。

4

1 回答 1

5

我以前遇到过这种问题。在我的情况下,这与 Entity Framework ObjectContexts 没有被正确处理有关,最终太多的上下文被启动并且网站被推翻了。我们使用 Entity Framework Profiler 确定在抛出错误时有很多未关闭的 ObjectContext。

迁移到工作单元设计模式(或类似模式)对我们来说是不可行的,因为它需要重写业务层,因此,我们通过在每次页面请求后手动关闭 ObjectContexts 来解决它。我们采用了在 Global.asax 的 End Request 事件中手动处理上下文的方法,但是,其他有效的方法是将上下文存储在 HttpContext 中或实现一个具有“每个请求”的 IoC 容器(例如 Castle Windsor) “ 生活方式。

于 2012-10-05T14:12:00.463 回答