随机 LinQ-SQL 错误和数据库突然关闭

Random LinQ-SQL errors and sudden database closing

我的 ASP 网站有时会抛出 2 或 3 个错误。当我从一个页面快速转到另一个页面时,通常会发生这种情况。通常,当我给它时间时,它不会

它们都与数据库连接有关,我试图弄清楚是什么时候或什么触发了这种行为,特别是当我无法获得确切的point/cause/scenario这种情况发生时

所以,我的数据库上下文是这样处理的:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Linq.Mapping;
using System.Web.UI;

namespace Models
{
    public partial class MainDataContext
    {
        [Function(Name = "NEWID", IsComposable = true)]
        public Guid Random()
        { // to prove not used by our C# code... 
            throw new NotImplementedException();
        }

        private static MainDataContext _DataContext;
        public static MainDataContext CurrentContext
        {
            get
            {
                Page page = HttpContext.Current.Handler as Page;

                if (page != null)
                {
                    _DataContext = ((FrontEndPage)page).DataContext;
                }
                if (_DataContext == null)
                    _DataContext = new MainDataContext();

                return _DataContext;
            }
        }
    }
}

这将在 FrontEndPage 中使用,它将有 db 成员用于与数据库通信,

using System;

using System.Web.UI;
using Models;
using Managers;

public class FrontEndPage : System.Web.UI.Page
{
    protected MainDataContext db = new MainDataContext();
    public OrderManager OrderManager = new OrderManager();

    public void Page_PreInit(object sender, EventArgs e)
    {

    }

    public MainDataContext DataContext
    {
        get
        {
            return db;
        }
    }

    public MasterPage MyMaster { get; set; }

    public Meta Meta { get; set; }

    public String CurrentPage { get; set; }
}

从这个我得到任何我需要的任何页面的 class,例如:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Models;

public partial class Page_Default : FrontEndPage
{
    protected Models.Content contactContent;

    protected ShopItem shopItem;

    protected void Page_Load(object sender, EventArgs e)
    {
        contactContent = db.Contents.FirstOrDefault(a => a.FixedRef == "contact");
    }

    protected void btnTest_Click(object sender, EventArgs e)
    {
        OrderManager.addItemToBasket(shopItem, "");
        db.SubmitChanges();
        Response.Redirect("/basket");
    }
}

出现的一些错误是:

The operation cannot be performed during a call to SubmitChanges

There is already an open DataReader associated with this Command which must be closed first.

ExecuteReader requires an open and available Connection. The connection's current state is open.

所有这一切都发生在我浏览页面时。我按 F5,它们通常会消失,页面会出现,但随后它们会随机返回,通常是当我快速从一个页面切换到另一个页面时。我猜这与 MainDataContextFrontEndPage classes 有关,所以我只添加了这两个 classes.

的所有代码

如果需要,我会为 Page_Default 添加更多内容,但我想知道数据库连接的创建和保持方式是否是目前的问题。

   private static MainDataContext _DataContext;

繁荣;死亡。永远不要这样做。曾经。数据上下文:

  • 不是线程安全的;它将精确扩展到一个并发用户
  • 需要在发生更改时放弃 and/or 中止 - 所以:您现在向您的一个并发用户显示不一致的旧数据
  • 会导致大型 GC 问题,因为它会跟踪所有对象,慢慢地将整个数据库加载到内存中(两次,因为更改跟踪)并将其保存在那里;所以你现在非常慢向你的一个并发用户显示不一致的旧数据

数据上下文应该只在单个请求期间存在。

巧合的是,我刚才提到了这个确切的场景(作为一件坏事)to someone asking about bad performance due to garbage collection