Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Новый топик    Ответить
 Открытый SqlConnection/System.Data.Linq.DataContext в .NET  [new]
Raziel
Member

Откуда:
Сообщений: 496
Вот такой вопрос. Что предпочтительнее - держать открытым SqlConnection/DataContext на всё время работы программы либо перед каждым запросом его открывать, а потом закрывать?
Начальник говорит, что открытый SqlConnection жрёт много ресурсов, где-то по форумам читал, что открытие/закрытие соединения с БД жрёт много ресурсов. Так кто прав?
6 апр 10, 14:55    [8586467]     Ответить | Цитировать Сообщить модератору
 Re: Открытый SqlConnection/System.Data.Linq.DataContext в .NET  [new]
МСУ
Member [заблокирован]

Откуда: http://codearticles.ru
Сообщений: 31089
Открывать контекст или соединение только для обращения к БД и сразу же, как только надобность в БД отпала, закрывать.
6 апр 10, 15:20    [8586756]     Ответить | Цитировать Сообщить модератору
 Re: Открытый SqlConnection/System.Data.Linq.DataContext в .NET  [new]
Raziel
Member

Откуда:
Сообщений: 496
А как быть с DataContext? У него же нет методов Open/Close.
6 апр 10, 16:42    [8587621]     Ответить | Цитировать Сообщить модератору
 Re: Открытый SqlConnection/System.Data.Linq.DataContext в .NET  [new]
МСУ
Member [заблокирован]

Откуда: http://codearticles.ru
Сообщений: 31089
Raziel
А как быть с DataContext? У него же нет методов Open/Close.

using (NorthwindDataContext ctx = new NorthwindDataContext())
{
    // ...
}

P.S. Посмотрите еще паттерн Repository.
6 апр 10, 16:54    [8587724]     Ответить | Цитировать Сообщить модератору
 Re: Открытый SqlConnection/System.Data.Linq.DataContext в .NET  [new]
зы
Member

Откуда:
Сообщений: 2530
Raziel
А как быть с DataContext? У него же нет методов Open/Close.

DataContext не держит открытых соединений, следовательно без нужды вызывать Dispose() у него не обязательно.
6 апр 10, 21:21    [8588976]     Ответить | Цитировать Сообщить модератору
 Re: Открытый SqlConnection/System.Data.Linq.DataContext в .NET  [new]
МСУ
Member [заблокирован]

Откуда: http://codearticles.ru
Сообщений: 31089
Raziel, не слушайте никого и знайте: юзинговать (диспоузить) нужно всё, что наследуется от IDisposable при условии, если оно уже не нужно.
Используйте using и не заморачивайтесь над тем, открыто ли соединение, созданы ли какие-то доп. экземпляры классов и прочее.
7 апр 10, 09:52    [8590077]     Ответить | Цитировать Сообщить модератору
 Re: Открытый SqlConnection/System.Data.Linq.DataContext в .NET  [new]
зы
Member

Откуда:
Сообщений: 2530
МСУ
Raziel, не слушайте никого и знайте: юзинговать (диспоузить) нужно всё, что наследуется от IDisposable при условии, если оно уже не нужно.

Ключевое слово у тебя - "если оно уже не нужно". Если нужно, using-ом не воспользоваться, то конкретно DataContext диспоузить не обязательно.
7 апр 10, 12:19    [8591307]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Открытый SqlConnection/System.Data.Linq.DataContext в .NET  [new]
Questq2
Member

Откуда:
Сообщений: 56
А если у меня 15 объектов, работающих каждый в своем потоке, и каждый делает 5 запросов в секунду к одной и то же таблице БД. Как правильно организовать работу с DataContext?:

1. Создавать DataContext на уровне объекта, чтобы для каждого потока был свой DataContext. Я делаю его статическим.

public static MyDataBaseDataContext = new MyDataBaseDataContext;

При такой кострукции, после нескольких срабатываний, я получаю ошибку, что "Существует назначенный этой команде Command открытый DataReader, который требуется предварительно закрыть"

2. Создавать DataContext перед выполнение каждого запроса через

using (var dc = new MyDataBaseDataContext()) {}

Но резульататы LINQ запроса мне надо отрисовывать, то есть обрабоку полученного query мне нужно делегировать в поток диспетчера, а если внутри using {} попыаться сделать что-то типа MyWindow.Dispatcher.BeginInvoke(new ThreadStart(() => и т.д., то все падает с ошибкой.

3. Если просто в начале метода, без using, создавать DataContext

var dc = new MyDataBaseDataContext()

...то так работает и не падает, по идет дикая загрузука ЦП от sqlservr.exe.

Как правильно организовать работу с DataContext в моем случае, то есть в случае большого и постоянного количества запросов к БД?
28 июн 11, 18:39    [10888793]     Ответить | Цитировать Сообщить модератору
 Re: Открытый SqlConnection/System.Data.Linq.DataContext в .NET  [new]
VitaliyBoris
Member

Откуда: Минск
Сообщений: 213
Questq2,

Я бы использовал первый вариант (создание DataContext-а на уровне объекта). А почему Вы его делаете static?
29 июн 11, 17:29    [10894945]     Ответить | Цитировать Сообщить модератору
 Re: Открытый SqlConnection/System.Data.Linq.DataContext в .NET  [new]
Questq2
Member

Откуда:
Сообщений: 56
VitaliyBoris, статик - просто для удобства обращения к нему. Думаете, ошибка связана с этим?
29 июн 11, 18:12    [10895386]     Ответить | Цитировать Сообщить модератору
 Re: Открытый SqlConnection/System.Data.Linq.DataContext в .NET  [new]
Questq2
Member

Откуда:
Сообщений: 56
VitaliyBoris, я убрал статик, падать перестало, но загрузка проца осталась. Значит, видимо, дело не в коннекте.

Я создал отдельную тему по своей проблеме https://www.sql.ru/forum/actualthread.aspx?tid=862740, там все описано более подробно. В двух словах - формально все работает, но очень ресурсов много проца жрет sqlservr.exe, при любом варианте использования DataContext.
29 июн 11, 18:31    [10895501]     Ответить | Цитировать Сообщить модератору
 Re: Открытый SqlConnection/System.Data.Linq.DataContext в .NET  [new]
Questq2
Member

Откуда:
Сообщений: 56
Вот рабочая ссылка https://www.sql.ru/forum/actualthread.aspx?tid=862740
29 июн 11, 18:32    [10895504]     Ответить | Цитировать Сообщить модератору
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Ответить