![]() |
Модераторы: gambit |
![]() ![]() ![]() |
|
emmanuil |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 380 Регистрация: 9.1.2007 Репутация: 1 Всего: 3 |
Всегда считал, что в приложении лучше подключаться к базе через один коннекшин, соответственно и все через него. Но на форуме встречал и такое, что при необходимости работы с базой(достать какиенибудт данные, заполнить комбо бокс...), создавали новое подключение. Может это просто в примерах так? Но все же очень интересно знать Ваше мнение. И как вообще лучше и правильнее организовать работу с базой данных?
|
|||
|
||||
6atoh |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 160 Регистрация: 15.9.2006 Где: Minsk Репутация: 1 Всего: 4 |
Открытый коннекшн к базе требует довольно много ресурсов на сервере. В то же время для открытия соединения требуется немало времени.
В winforms-приложениях можно использовать один коннекшн для всех операций с базой (если нагрузка на сервер небольшая). В приложениях ASP.NET как ни крути приходится каждый раз открывать и закрывать новый коннекшн (такова архитектура). |
|||
|
||||
emmanuil |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 380 Регистрация: 9.1.2007 Репутация: 1 Всего: 3 |
6atoh, спасибо!
|
|||
|
||||
ivashkanet |
|
|||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 4 Всего: 149 |
Один коннекшн использовать можно. Даже в ASP .Net (например работать только через класс аля пул коннекшинов).
Но все же рекомендуется держать коннекшн открытым ровно столько, сколько ты манипулируешь данными. Поэтому количество разных коннекшинов не важно, важно закрывать их во время. |
|||
|
||||
emmanuil |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 380 Регистрация: 9.1.2007 Репутация: 1 Всего: 3 |
Речь идет пока только о Windows-приложениях!
Разве не лучше и правельнее, когда сервер бд открывает один сеанс и в этом сеансе работает программа? Будут ли видны временные локальные таблицы в разных коннектах? При нескольких коннектах ведь тратится время на проверки там всякие у сервера, а через один коннект, проверки проходят однажды, и программа работает в одном сеансе с одним spid'ом, в одном "пространстве", если я не прав, поправьте меня! |
|||
|
||||
ivashkanet |
|
|||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 4 Всего: 149 |
emmanuil, что ты подразумеваешь под "коннекшн"?
Если "налаживание связи с БД+получение/передача информации+закрытие связи", то все как я сказал. Судя по этому тексту ты путаешь коннекшн с экземпляром DataSet, который и содержит "временные локальные таблицы" и, если ты добавишь эту функциональность, то и "на проверки там всякие". |
|||
|
||||
emmanuil |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 380 Регистрация: 9.1.2007 Репутация: 1 Всего: 3 |
ivashkanet, нет не путаю! Именно так! DataSet получает данные через что?! Через коннекшин. Коннект - это всмысле открытое соединение, например SqlConnection. Ведь DataSet и др. сами по себе не подключаются к базе. Вот я и говорю, что нужен централизованный доступ к базе - тобиш коннекшин, и один по возможности. Когда происходит подключение к базе, то в базе создается пространство - сессия, и она при каждом коннекте разная. Это чтобы небыло конфликтов при одновременном доступе нескольких пользователей. А времен. лок. табл. это таблица в базе, напр. #tempTable, а во все не DataSet'а!
Я вот незнаю точно как DataSet работает, но наверное он не создает временных таблиц в базе! Он просто держит в себе структуру таблиц(ы) и подгружает данные с помощью адаптера или еще чего нибудь! Если будет один коннект, то коннекшин ведь не просто для подключения, он выполняет ряд важных функций! Если все это не так, поправьте меня! |
|||
|
||||
ivashkanet |
|
|||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 4 Всего: 149 |
emmanuil, ну раз не путаешь, то не путаешь
![]() В любом случае СУБД не будет хранить данные о подключении конкретного коннектора. Так что, ИМХО, нет разницы создал ты новый объект коннекшина для подключения, либо используешь старый (переоткрыв его). Короче, тут моя компетенция заканчивается. Я высказал свое мнение. Возможно я и не прав, но опровержений не вижу. Бум ждать кого-нить более опытного. |
|||
|
||||
LuMee |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 117 Регистрация: 30.3.2007 Репутация: нет Всего: 1 |
Возможно, не совсем правильно понял, о чем речь, но все же выскажусь.
.NET, насколько я знаю, самостоятельно поддерживает пул коннекшенов, так что при создании нового он, скорее всего, будет взят из пула (или создан заново, если свободных коннектов в пуле нету). По этой причине держать какой-то один коннекшн на все приложение, по сути, нет смысла, главное - не допускать, чтобы слишком много коннекшенов было открыто одновременно. У меня, например, работа с коннекшенами осуществляется примерно в таком ключе:
|
|||
|
||||
ivashkanet |
|
|||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 4 Всего: 149 |
![]() LuMee, connection.Close делать не обязательно Using сам сделает это за тебя. (по сути, Using вызовет connection.Dispose(), который в свою очередь закроет коннекшн) Но это оффтоп |
|||
|
||||
LuMee |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 117 Регистрация: 30.3.2007 Репутация: нет Всего: 1 |
ivashkanet, привычка - для пущей, так сказать, верности
![]() |
|||
|
||||
Voyager |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 532 Регистрация: 8.2.2005 Репутация: нет Всего: 18 |
Использую 1 connection, вначале программы открываю, в конце закрываю (мое мнение).
|
|||
|
||||
LuMee |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 117 Регистрация: 30.3.2007 Репутация: нет Всего: 1 |
Voyager, не очень хороший подход. Большую часть времени коннекшн простаивает, вхолостую расходуя ценный ресурс. Для локальной БД (типа Аксеса) это совершенно некритично, но если речь идет о многопользовательской работе с серверной БД, то такой вариант уже чреват боком.
С каждым новым пользователем у сервера будет все меньше памяти, а там, глядишь, и свободные коннекшены закончатся, так что очередной юзер просто не сможет подключиться. Вариант, которого я придерживаюсь, хорош тем, что в каждый момент открыто ровно столько коннекшенов, сколько нужно для работы, причем каждый из них открыт ровно столько времени, сколько надо. В результате можно даже 5ю коннекшенами обслуживать с десяток-другой юзеров. |
|||
|
||||
emmanuil |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 380 Регистрация: 9.1.2007 Репутация: 1 Всего: 3 |
Речь идет не о том какое время держать коннект открытым, а о том сколько коннектов использовать!!!
Коннекшин(к примеру SqlConnection) нужен не просто для коннекта, а чтобы централизовать работу с базой и много другого! Как на счет временных локальных таблиц на сервера?! Если они были созданы с одним коннекшином, то закрыв соединение, эти таблицы уничтожатся. Да и если с одним коннекшином их создаешь, то с другим коннекшином их будет уже не видно! А если они нужны где-то в другом месте программы?! Очень часто при разработке больших и сложных систем без временных таблиц на сервере не обойтись! А что касается нагрузки на сервер, то в этом случае может и целесообразнее открыть коннект -> отработать -> закрыть. Но тоже не уверен. С одной стороны: Централизованная работа с базой, один сеанс (в SqlServer'е это @@spid). с другой - нагрузка на сервер. Так как же лучше? Как правильнее? Добавлено через 10 минут и 2 секунды ivashkanet, речь не идет о том сколько объектов использовать, может просто я не так выразился. Хочу узнать как правильнее организовать работу с базой: через одно соединение(открыть в начале работы и закрыть в конце) или через несколько (открывать соединение при необходимости). И просьба писать положительные/отриц. стороны того и другого! Благодарю всех за участие! Вопрос еще открыт! |
|||
|
||||
ivashkanet |
|
|||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 4 Всего: 149 |
Т.Е. все как сказал LuMee Это сообщение отредактировал(а) ivashkanet - 24.4.2007, 14:42 |
|||
|
||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Базы данных под .NET | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |