【问题标题】:Asp.Net MVC double submit/request breaks SQL connectionAsp.Net MVC 双重提交/请求中断 SQL 连接
【发布时间】:2010-08-04 05:41:50
【问题描述】:

我遇到了一个我不完全理解的奇怪问题。主要症状是当我双击 MVC 应用程序中的链接(指向控制器操作)时,我的数据库服务器连接被破坏,并且出现错误:

命令的执行需要一个开放且可用的连接。连接的当前状态已断开。

如果我从控制器操作顶部的断点开始单步执行,它将向下跳几行,然后跳回到断点。不知何故,第一个请求在第二个请求到达之前没有完全执行,并且当它到达任何查询时,我的数据库连接以某种方式中断。每次发生这种情况,我都必须重新启动应用程序服务器。

起初它是间歇性发生的,但双击链接似乎每次都重现它。这在别人身上发生过吗?我在这里错过了什么?

谢谢,

生锈

更新:

A.) 当我们实际使用 Linq-to-entities 时,我错误地将其标记为 Linq-to-sql。 B.) 连接对象被定义为控制器的成员变量:

namespace C2S.Controllers
{
    public class ArtifactController : Controller
    {
        private c2sEntities _entities = new c2sEntities();
        ...

我注意到在一些 asp.net 教程中,他们在同一位置声明了变量,但对初始化 db 对象的控制器有一个单独的构造函数。这有什么区别吗?

C.) 问题不仅在于如上所述的双击。连接在其他看似随机的时间中断;我似乎无法始终如一地重现该错误(即使双击也不总是会破坏它)。重新启动网站通常会修复它,尽管有时我必须重新启动主机。备份后,重复相同的操作序列通常不会重现相同的错误!

关于设置我的 linq-to-entities 类或数据库连接的性质,我可能有一些不明白的地方。有人有想法吗?我真的不知道如何调查这个!

再次感谢

生锈

【问题讨论】:

    标签: asp.net asp.net-mvc sql-server-2005 asp.net-mvc-2 linq-to-entities


    【解决方案1】:

    从您对问题的描述中很难说,但第一个猜测是:

    您的连接对象是静态的(即控制器或应用程序级别)还是在操作中本地定义的?双击链接会触发该事件两次,这听起来就像您在此处描述的那样。所以第一次调用创建了连接,然后第二次调用进入并践踏了对方法的第一次调用,中断了它认为的连接。

    编辑:问题是否仅在双击时出现。如果您只单击链接,它是否按预期工作?有问题的代码示例会有所帮助。

    【讨论】:

    • 保罗,谢谢您的回复。我现在才回到这个问题。为了回答您的问题,连接对象在控制器类中全局定义。单击似乎大部分时间都有效......但请参阅上面的更新描述。有什么想法吗?
    • 我建议将您的连接对象从控制器中的全局连接移到需要它们的方法/操作中的本地创建/管理的连接中。有时,拥有单一连接并且一切都挂在它上面似乎是最佳解决方案。但是正如您发现的那样,它本身就有很多问题,很难调试。相反,最好只在需要时创建它们并且只在尽可能短的时间内打开它们。将其留给连接池,以最大限度地减少提供新连接所需的时间等。
    • 正如 JesseGavin 下面所说,确保正确打开/关闭连接和命令对象至关重要。他提供的示例代码是一个很好的起点。编辑:我看到你也更新了标签,我上面关于将连接对象本地化为方法等的 cmets 仍然有效。
    【解决方案2】:

    我猜您没有正确关闭数据库连接。您应该考虑使用using 语句。

    using(SqlConnection conn = new SqlConnection("connstring")) {
      using (SqlCommand cmd = new SqlCommand("SQLSTATEMENT", conn)) {
        // more code here......
      } 
    }
    

    这将确保即使您的代码某处出现错误,您的连接也会关闭。

    在此处阅读所有相关信息:http://davidhayden.com/blog/dave/archive/2005/01/13/773.aspx

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-29
      • 2015-11-19
      • 1970-01-01
      • 1970-01-01
      • 2013-11-03
      • 2018-09-12
      • 2021-05-07
      • 2014-04-05
      相关资源
      最近更新 更多