【问题标题】:Random LinQ-SQL errors and sudden database closing随机 LinQ-SQL 错误和数据库突然关闭
【发布时间】:2018-02-01 09:39:58
【问题描述】:

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

它们都与数据库连接有关,我试图弄清楚在什么点或什么触发了这种行为,特别是当我无法得到确切的点/原因/场景时

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

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; }
}

从这个我为我需要的任何页面派生任何类,例如:

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 类有关,所以我只添加了这两个类的所有代码。

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

【问题讨论】:

  • 这是您的第一个问题:从不,永远不要将单例实例用于数据库上下文。您应该重新编写使用public static MainDataContext CurrentContext 的每一段代码并完全删除CurrentContext_DataContext
  • 哇。我刚刚看到它是一个静态成员。我以为不是所有的时间。谢谢。这可能是一个主要原因

标签: c# asp.net linq datacontext


【解决方案1】:
   private static MainDataContext _DataContext;

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

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

数据上下文应该只存在于单个请求的持续时间内。

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

【讨论】:

  • 这是我尝试修改的一些非常古老的代码。太老了,我几乎忘记了 ASP,所以我试图把它带到新的标准。我想我将不得不进行调查,看看现在推荐什么来替换它
  • @bMain 这从来都不好;这不是“新标准”——这段代码一直被彻底破坏
  • 我明白了。我将看看最佳实践,然后改变一切。甚至不会费心去寻找“问题”,因为数据上下文背后似乎一切都是错误的
  • @MarcGravell 实现这一目标的正确方法是什么?
猜你喜欢
  • 2015-03-15
  • 1970-01-01
  • 2018-07-02
  • 2021-11-13
  • 2014-12-04
  • 2023-02-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-31
相关资源
最近更新 更多