Модераторы: gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сколько коннектов использовать 
:(
    Опции темы
emmanuil
Дата 20.4.2007, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 9.1.2007

Репутация: 1
Всего: 3



Всегда считал, что в приложении лучше подключаться к базе через один коннекшин, соответственно и все через него. Но на форуме встречал и такое, что при необходимости работы с базой(достать какиенибудт данные, заполнить комбо бокс...), создавали новое подключение. Может это просто в примерах так? Но все же очень интересно знать Ваше мнение. И как вообще лучше и правильнее организовать работу с базой данных?
PM MAIL   Вверх
6atoh
Дата 20.4.2007, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 160
Регистрация: 15.9.2006
Где: Minsk

Репутация: 1
Всего: 4



Открытый коннекшн к базе требует довольно много ресурсов на сервере. В то же время для открытия соединения требуется немало времени. 
    В winforms-приложениях можно использовать один коннекшн для всех операций с базой (если нагрузка на сервер небольшая). В приложениях ASP.NET как ни крути приходится каждый раз открывать и закрывать новый коннекшн (такова архитектура).
PM MAIL ICQ   Вверх
emmanuil
Дата 23.4.2007, 07:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 9.1.2007

Репутация: 1
Всего: 3



6atoh, спасибо!
PM MAIL   Вверх
ivashkanet
Дата 23.4.2007, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 4
Всего: 149



Один коннекшн использовать можно. Даже в ASP .Net (например работать только через класс аля пул коннекшинов).
Но все же рекомендуется держать коннекшн открытым ровно столько, сколько ты манипулируешь данными. Поэтому количество разных коннекшинов не важно, важно закрывать их во время.
PM MAIL WWW ICQ   Вверх
emmanuil
Дата 23.4.2007, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 9.1.2007

Репутация: 1
Всего: 3



Речь идет пока только о Windows-приложениях!
Разве не лучше и правельнее, когда сервер бд открывает один сеанс и в этом сеансе работает программа? Будут ли видны временные локальные таблицы в разных коннектах? При нескольких коннектах ведь тратится время на проверки там всякие у сервера, а через один коннект, проверки проходят однажды, и программа работает в одном сеансе с одним spid'ом, в одном "пространстве", если я не прав, поправьте меня!
PM MAIL   Вверх
ivashkanet
Дата 23.4.2007, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 4
Всего: 149



emmanuil, что ты подразумеваешь под "коннекшн"?
Если "налаживание связи с БД+получение/передача информации+закрытие связи", то все как я сказал.
Цитата(emmanuil @  23.4.2007,  11:44 Найти цитируемый пост)
Разве не лучше и правельнее, когда сервер бд открывает один сеанс и в этом сеансе работает программа? Будут ли видны временные локальные таблицы в разных коннектах? При нескольких коннектах ведь тратится время на проверки там всякие у сервера, а через один коннект, проверки проходят однажды, и программа работает в одном сеансе с одним spid'ом, в одном "пространстве", если я не прав, поправьте меня! 

Судя по этому тексту ты путаешь коннекшн с экземпляром DataSet, который и содержит "временные локальные таблицы" и, если ты добавишь эту функциональность, то и "на проверки там всякие".
PM MAIL WWW ICQ   Вверх
emmanuil
Дата 24.4.2007, 06:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 9.1.2007

Репутация: 1
Всего: 3



ivashkanet, нет не путаю! Именно так! DataSet получает данные через что?! Через коннекшин. Коннект - это всмысле открытое соединение, например SqlConnection. Ведь DataSet и др. сами по себе не подключаются к базе. Вот я и говорю, что нужен централизованный доступ к базе - тобиш коннекшин, и один по возможности. Когда происходит подключение к базе, то в базе создается пространство - сессия, и она при каждом коннекте разная. Это чтобы небыло конфликтов при одновременном доступе нескольких пользователей. А времен. лок. табл. это таблица в базе, напр. #tempTable, а во все не DataSet'а! 
Цитата
Судя по этому тексту ты путаешь коннекшн с экземпляром DataSet, который и содержит "временные локальные таблицы"

Я вот незнаю точно как DataSet работает, но наверное он не создает временных таблиц в базе! Он просто держит в себе структуру таблиц(ы) и подгружает данные с помощью адаптера или еще чего нибудь! Если будет один коннект, то коннекшин ведь не просто для подключения, он выполняет ряд важных функций! Если все это не так, поправьте меня!
PM MAIL   Вверх
ivashkanet
Дата 24.4.2007, 07:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 4
Всего: 149



emmanuil, ну раз не путаешь, то не путаешь smile (судя по посту, точно нет)

В любом случае СУБД не будет хранить данные о подключении конкретного коннектора. Так что, ИМХО, нет разницы создал ты новый объект коннекшина для подключения, либо используешь старый (переоткрыв его).

Короче, тут моя компетенция заканчивается. Я высказал свое мнение. Возможно я и не прав, но опровержений не вижу. 
Бум ждать кого-нить более опытного.

PM MAIL WWW ICQ   Вверх
LuMee
Дата 24.4.2007, 08:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 30.3.2007

Репутация: нет
Всего: 1



Возможно, не совсем правильно понял, о чем речь, но все же выскажусь.
.NET, насколько я знаю, самостоятельно поддерживает пул коннекшенов, так что при создании нового он, скорее всего, будет взят из пула (или создан заново, если свободных коннектов в пуле нету). По этой причине держать какой-то один коннекшн на все приложение, по сути, нет смысла, главное - не допускать, чтобы слишком много коннекшенов было открыто одновременно.
У меня, например, работа с коннекшенами осуществляется примерно в таком ключе:
Код

using (SqlConnection connection = new SqlConnection(connestionString))
{
    ... // тут выполняем по-быстрому операции с данными, чтобы как можно скорее 
        // коннекшн закрыть
    connection.Close();
}

PM MAIL   Вверх
ivashkanet
Дата 24.4.2007, 08:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 4
Всего: 149



 smile 
LuMee, connection.Close делать не обязательно Using сам сделает это за тебя. (по сути, Using вызовет connection.Dispose(), который в свою очередь закроет коннекшн) Но это оффтоп
PM MAIL WWW ICQ   Вверх
LuMee
Дата 24.4.2007, 08:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 30.3.2007

Репутация: нет
Всего: 1



ivashkanet, привычка - для пущей, так сказать, верности smile Хотя на самом деле действительно не нужно
PM MAIL   Вверх
Voyager
Дата 24.4.2007, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 532
Регистрация: 8.2.2005

Репутация: нет
Всего: 18



Использую 1 connection, вначале программы открываю, в конце закрываю (мое мнение).
PM   Вверх
LuMee
Дата 24.4.2007, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 30.3.2007

Репутация: нет
Всего: 1



Voyager, не очень хороший подход. Большую часть времени коннекшн простаивает, вхолостую расходуя ценный ресурс. Для локальной БД (типа Аксеса) это совершенно некритично, но если речь идет о многопользовательской работе с серверной БД, то такой вариант уже чреват боком.
С каждым новым пользователем у сервера будет все меньше памяти, а там, глядишь, и свободные коннекшены закончатся, так что очередной юзер просто не сможет подключиться.
Вариант, которого я придерживаюсь, хорош тем, что в каждый момент открыто ровно столько коннекшенов, сколько нужно для работы, причем каждый из них открыт ровно столько времени, сколько надо. В результате можно даже 5ю коннекшенами обслуживать с десяток-другой юзеров.
PM MAIL   Вверх
emmanuil
Дата 24.4.2007, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 9.1.2007

Репутация: 1
Всего: 3



Речь идет не о том какое время держать коннект открытым, а о том сколько коннектов использовать!!! 
Коннекшин(к примеру SqlConnection) нужен не просто для коннекта, а чтобы централизовать работу с базой и много другого! Как на счет временных локальных таблиц на сервера?! Если они были созданы с одним коннекшином, то закрыв соединение, эти таблицы уничтожатся. Да и если с одним коннекшином их создаешь, то с другим коннекшином их будет уже не видно! А если они нужны где-то в другом месте программы?! Очень часто при разработке больших и сложных систем без временных таблиц на сервере не обойтись!
А что касается нагрузки на сервер, то в этом случае может и целесообразнее открыть коннект -> отработать -> закрыть. Но тоже не уверен.
С одной стороны:
Централизованная работа с базой, один сеанс (в SqlServer'е это @@spid).
с другой - нагрузка на сервер.
Так как же лучше? Как правильнее?

Добавлено через 10 минут и 2 секунды
ivashkanet, речь не идет о том сколько объектов использовать, может просто я не так выразился. Хочу узнать как правильнее организовать работу с базой: через одно соединение(открыть в начале работы и закрыть в конце) или через несколько (открывать соединение при необходимости). И просьба писать положительные/отриц. стороны того и другого! 
Благодарю всех за участие! Вопрос еще открыт!
PM MAIL   Вверх
ivashkanet
Дата 24.4.2007, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 4
Всего: 149



Цитата(MSDN)

SQLConnection.Open()

The SqlConnection draws an open connection from the connection pool if one is available. Otherwise, it establishes a new connection to an instance of SQL Server.

Т.Е. все как сказал LuMee
Цитата(LuMee @  24.4.2007,  07:18 Найти цитируемый пост)
.NET, насколько я знаю, самостоятельно поддерживает пул коннекшенов, так что при создании нового он, скорее всего, будет взят из пула (или создан заново, если свободных коннектов в пуле нету). По этой причине держать какой-то один коннекшн на все приложение, по сути, нет смысла, главное - не допускать, чтобы слишком много коннекшенов было открыто одновременно.


Это сообщение отредактировал(а) ivashkanet - 24.4.2007, 14:42
PM MAIL WWW ICQ   Вверх
adLucem
Дата 27.4.2007, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 17.4.2007
Где: Украина, Донецк

Репутация: нет
Всего: 5



Вопрос можно разделить на два:
1. Сколько объектов соединений нужно использовать в процессе?
1. Определяется использованием многопоточных транзакций. В рамках каждого потока следует изолировать объекты соединений. Следовательно, если в программе параллельно может работать несколько потоков, каждый из которых связывается с базой данных, то каждый из потоков должен использовать только собственные объекты соединений.

2. Сколько соединений следует держать открытыми в каждом потоке?
Определяется архитектурой приложения, которая касается обработки транзакций, то есть количество соединений на поток должно минимальным, но не меньше чем необходимо с технической точки зрения.
Например, если архитектура базируется не на отсоединенных таблицах данных а на обработке множества записей (с использованием DbDataReader), то несколько соединений может понадобиться при параллельном доступе нескольких классов, каждый из которых осуществляет получение данных с использованием множества записей (так как на одном открытом соединении в каждый момент времени может быть открыто только одно множество записей).

Итого.
Количество соединений определяется с одной стороны, количеством параллельных транзакций, а с другой стороны, количеством соединений, необходимых для выполнения каждой транзакции.
Соединения следует либо закрывать после окончания работы с ними, либо использовать класс оболочку, который является высокоуровневым пулом соединений и гарантирует правильность работы с ними (в частности отслеживает состояние соединений).

Область использования приложений с одним, постоянно открытым соединением вообще мне не ясна.
PM MAIL ICQ   Вверх
emmanuil
Дата 2.5.2007, 05:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 9.1.2007

Репутация: 1
Всего: 3



Может оно и так, но скорее всего в пуле находятся сведения авторизации и прочее. А вот при создании нового соединения @@spid каждый раз разный, а весь смысл в том чтобы @@spid был одинаковый. @@spid у каждого коннекта разный, это сделано для того чтобы не было конфликтов между пользователями. Допустим при создании локальной временной таблицы в базе, ее не видит другой пользователь, у которого другой @@spid. @@spid - это проще говоря сеанс, пространство, которое отводится для соединения!
А пул на это никак ни влияет! Так и не нашел однозначного ответа! И в одном способе есть плюсы и минусы и в другом! А как наиболее эффективно сделать, ответа не получил. Наверное все зависит от конкретной задачи! Ну что ж, всем спасибо! Если еще есть мнения, буду рад!
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Базы данных под .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0954 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.