Pull to refresh

Ошибки LINQ to SQL на сайтах при нагрузке (> 30 пользователей)

Reading time3 min
Views2.2K
Совсем недавно начал использовать LINQ to SQL и при нагрузках на сайт стал замечать такого рода ошибки,
при чем появляются в стиле корейского Random-а:

вариант 1) InvalidCastException
вариант 2) DataReader is closed
вариант 3) SQL Server также генерирует ошибку связаную с MARS и рвет соединение


Как обычно выглядел класс с работой с LINQ:

using System.Linq;
using Kushatpodano.Ru.Models;

namespace Kushatpodano.Ru.Classes.BusinessLayer
{
  public class CustomPages
  {
    private readonly KushDBDataContext context = new KushDBDataContext();

    public static string PageText(string ActionResult)
    {
      return (from p in context.CustomPages
            where p.ActionResult == ActionResult
            select p).Single().PageText;
    }

    public static string PageTitle(string ActionResult)
    {
        return (from p in context.CustomPages
            where p.ActionResult == ActionResult
            select p).Single().PageTitle;
    }
  }
}


* This source code was highlighted with Source Code Highlighter.


Поиск по данным ошибкам в гугле практически ничего не давал, но вчера наткнулся на очередную тему на форуме с данной ошибкой, где было написано как ее обошли, после переписывания классов именно так — нагрузку перестал держать сам хостер, но LINQ держался молодцом:

using System.Linq;
using Kushatpodano.Ru.Models;

namespace Kushatpodano.Ru.Classes.BusinessLayer
{
  public class CustomPages
  {
    public static string PageText(string ActionResult)
    {
      string PageText;
      using (KushDBDataContext context = new KushDBDataContext())
      {
        PageText = (from p in context.CustomPages
              where p.ActionResult == ActionResult
              select p).Single().PageText;
      }

      return PageText;
    }

    public static string PageTitle(string ActionResult)
    {
      string PageTitle;
      using (KushDBDataContext context = new KushDBDataContext())
      {
        PageTitle = (from p in context.CustomPages
               where p.ActionResult == ActionResult
               select p).Single().PageTitle;
      }

      return PageTitle;
    }
  }
}


* This source code was highlighted with Source Code Highlighter.


На кажый блок обращений должен создаваться новый контекст и уничтожаться,
как в случае когда мы работаем с обычным SqlConnection.
Tags:
Hubs:
Total votes 12: ↑9 and ↓3+6
Comments12

Articles