2012-09-25 85 views
11

只是想让大家运行一下,看看是否有任何明智的想法,因为在整整一天,搜索的夜晚和早晨之后,我已经用尽了所有想法。在并发使用情况下(硒测试),我们遇到的问题总是集中于数据库连接,例如,超时,掉线/关闭连接,数据库服务器无法访问。Azure数据库并发使用问题

该问题似乎仅限于Azure,因为即使在指向同一数据库的相同代码(SQL Azure)上运行相同的Selenium测试,我们仍未在本地遇到问题,因此它会指向它SQL Azure中出站数据库连接的一些问题。到目前为止,我们已经试过如下:

  1. 天青的瞬态故障处理 - 我们已制订了重试逻辑 时没有与SQL Azure的服务本身就是一个暂时性的问题。
  2. 更改通信协议 - 我们尝试了TCP和命名管道 ,我们遇到了同样的问题。
  3. 调整数据库连接超时间隔 - 我们试过增加 这个无济于事。
  4. 添加多个活动结果集 - 我们已将此添加到 连接字符串中无济于事。
  5. 连接状态检查每个查询 - 当我们返回 DataContext时,我们检查它的连接并在必要时重新打开。
  6. 关闭连接池 - 我们也试图在没有 的情况下成功。
  7. 更改设计模式 - 我们甚至去实现 工作的设计模式,在数据库连接是 被解雇了和工作的每一个单位后处置的单位的长度,但这个 懒加载造成的问题在别处,将对象传入 方法中,并且在此 点处进行的返工太大。

  8. 更改角色大小 - 我想尝试的最后一件事是到了 作用大小的在Windows Azure的任何隐含的连接限制的情况下 - 这是目前正在部署所以还是有一半的机会就 可能工作!

站点基础设施如下:

  • DataContext类(延伸的DbContext),它是一个代码优先EF 上下文。
  • BusinessLayer类包含一个私有的非静态DataContext。 DataContext是注入到每个Manager/Helper类中的构造函数。
  • BusinessLayerService类包含一个公共的线程静态 BusinessLayer实例。
  • MVC站点使用BusinessLayerService.Instance访问经理 类,该类查询和更新已传递的DataContext。

任何帮助将不胜感激。

更新:我们将虚拟机大小调高至中等,它所做的只是意味着同样的问题需要更长的时间才能发生。

当问题开始发生的历史,一个团队成员指出下列异常发生:

InvalidOperationException异常:该命令的执行需要一个开放和可用的连接。连接的当前状态已中断。

只要数据库被击中(不是特定于某个特定的代码区域),就会发生这种情况。

+1

优秀的问题。 +1 –

+0

您是否尝试过使用经典的ADO.Net方法而不是EF?在使用SQL Azure时,有人告诉我们人们在使用EF时遇到了比ADO.Net更多的问题。 –

+1

@GauravMantri问题是,这个和其他各种项目我们已经在野外都使用EF,所以切换到ADO.NET将是一个耗时且成本高昂的过程:) – mattytommo

回答

5

我以前遇到过这类问题。在我的情况下,这是因为实体框架ObjectContexts没有得到妥善处理,最终导致太多的上下文被激化,网站被推翻了。我们使用Entity Framework Profiler识别出在引发错误时存在大量未关闭的ObjectContexts。

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