|
Принципы проектирования соединений клиентов (C# & ADO.Net & MSSQL2K)
|
|||
---|---|---|---|
#18+
Как человек, пришедший из среды Access ADP, блуждаю в раздумьях: «Как правильно подключаться к серверу?». В ADP было все просто – одно (ну или почти одно:)) подключение на проект, CurrentProject.Connection и пользуешься. Почитав теорию обнаружил, что ADO.Net предлагает отсоединятся от источника. Может для веба это и хорошо, но по моему скромному представлению в локальных проектах это приводит к задержкам при подключении. Хранить же датасет на клиенте представляется абсурдным из-за его размера. Я пошел по старому пути, создав одно подключение в основной форме, передавая его в дочерние, т.е. клиент постоянно «висит» подключенным. Насколько это правильно в концепции ADO.Net? А как быть с пользовательскими контролами использующими данные с сервера? Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2004, 20:23 |
|
Принципы проектирования соединений клиентов (C# & ADO.Net & MSSQL2K)
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2004, 22:38 |
|
Принципы проектирования соединений клиентов (C# & ADO.Net & MSSQL2K)
|
|||
---|---|---|---|
#18+
_ChaiNikПочитав теорию обнаружил, что ADO.Net предлагает отсоединятся от источника. Может для веба это и хорошо, но по моему скромному представлению в локальных проектах это приводит к задержкам при подключении.[quot]Лучше все таки наверно отключаться каждый раз. Как плюс - не придется писать логику проверки на случай обрыва соединения. [quot _ChaiNik]Хранить же датасет на клиенте представляется абсурдным из-за его размера. [quot] А зачем его хранить на клиенте? [quot _ChaiNik]Я пошел по старому пути, создав одно подключение в основной форме, передавая его в дочерние, т.е. клиент постоянно «висит» подключенным. Насколько это правильно в концепции ADO.Net?[quot] Вопрос не в правильности "концепции ADO.Net", а в правильности концепции твоей программы. Если ты считаешь что нужно постоянное соединение - то пусть оно и будет постоянным. [quot _ChaiNik]А как быть с пользовательскими контролами использующими данные с сервера?А что с пользовательскими контролами? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2004, 11:41 |
|
Принципы проектирования соединений клиентов (C# & ADO.Net & MSSQL2K)
|
|||
---|---|---|---|
#18+
Я делаю также. Осбенных неудобств не замечаю. И даже сам считаю - так правильнее. Есть только одно - в один момент может выполняться только одна комманда. Причем если использовать DataReader и при выполнении произошла ошибка, то выполнить вторую команду уже нельзя - ошибка Connection Busy или что- то подобное. Поэтому везде где у меня используется DataReader использую try...catch или finally где делаю if (DRdr!=null){DRdr.Close();} ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2004, 11:50 |
|
Принципы проектирования соединений клиентов (C# & ADO.Net & MSSQL2K)
|
|||
---|---|---|---|
#18+
Да. Еще хочу добавить. Я не передаю Connection в другие формы. Я делаю его static в главной форме и всегда могу к нему обратиться из любой формы как CMainFm.SqlCnn ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2004, 11:56 |
|
Принципы проектирования соединений клиентов (C# & ADO.Net & MSSQL2K)
|
|||
---|---|---|---|
#18+
Vova_GVPЯ делаю также. Осбенных неудобств не замечаю. И даже сам считаю - так правильнее. Есть только одно - в один момент может выполняться только одна комманда. Причем если использовать DataReader и при выполнении произошла ошибка, то выполнить вторую команду уже нельзя - ошибка Connection Busy или что- то подобное. Поэтому везде где у меня используется DataReader использую try...catch или finally где делаю if (DRdr!=null){DRdr.Close();} Вот про это и речь. Лучше уж открывать соединение каждый раз и закрывать когда оно больше не нужно. А для скорости работы можно разрешить использовать пул соединений. -- WBR, Roman S. Golubin -- Стек легко преобразуется в очередь при помощи автомата Калашникова. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2004, 12:16 |
|
Принципы проектирования соединений клиентов (C# & ADO.Net & MSSQL2K)
|
|||
---|---|---|---|
#18+
Vova_GVPДа. Еще хочу добавить. Я не передаю Connection в другие формы. Я делаю его static в главной форме и всегда могу к нему обратиться из любой формы как CMainFm.SqlCnn Котлеты с мухами мешать не стоит - данные должны быть в одном месте, UI - в другом. Логично предположить, что соединение не имеет ни какого отношения к форме. Лучше вынести всю работу с соединением с сервером в отдельный класс. Например, Application: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2004, 12:39 |
|
Принципы проектирования соединений клиентов (C# & ADO.Net & MSSQL2K)
|
|||
---|---|---|---|
#18+
Ну это уже вкуса, не спорю - можно и отдельным классом, но смысл использования одного Connection на все приложение от этого не меняется :) ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2004, 12:54 |
|
Принципы проектирования соединений клиентов (C# & ADO.Net & MSSQL2K)
|
|||
---|---|---|---|
#18+
VOVA_GVPНу это уже вкуса, не спорю - можно и отдельным классом Не во вкусе дело. После тебя этот проект другие люди сопровождать будут и им будет не очень понятно, исходя из каких соображений ты запихал соединение в форму. ИМО, обработку данных и UI вообще в отдельные библиотеки разносить надо. VOVA_GVPНо смысл использования одного Connection на все приложение от этого не меняется :) Смотри внимательно, что выше написано - каждый раз при вызове статичного Connection создается _НОВОЕ_ соединение. В продолжение примера: [scr c#] void DoWork(){ SqlConnection conn = Application.Connection; // Здесь выполняем действия с соединением conn.Close(); } [/src] Таким образом несколько потоков одновременно могут выполнять свою работу. У каждого - свое собственное соединение, которое, когда оно станет не нужно, поток закрывает сам. Плюсы: 1. Не надо гадать, оборвано ли, по какой либо причине, соединение или нет. Просто устанавливаем новое соединение и работаем с ним. 2. Не надо ждать, пока соединение перестанут использовать другие потоки. Минусы: 1. Время затраченное на создание нового соединения. (При помещении соединений в пул оно практически равно нулю). 2. Не забывать закрывать соединения после использования ;-)) -- WBR, Roman S. Golubin -- Стек легко преобразуется в очередь при помощи автомата Калашникова. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2004, 13:21 |
|
Принципы проектирования соединений клиентов (C# & ADO.Net & MSSQL2K)
|
|||
---|---|---|---|
#18+
Я не увидил у автора треда упоминаний о многопоточном приложении или асинхронных операциях. Т.е. можно обойтись и одним экземпляром, просто открывая/закрывая соединение. а так, да: 1) не держать клиента подключенным постоянно, просто на всякий случай. Открыли соединение, поработали и закрыли. 2) если приложение многопоточное и потоки работают с СУБД - то каждому потоку свое соединение. Иначе будут проблемы. 3) желательно всегда точно знать сколько соединений с СУБД у вас открыто в любой произвольно взятый момент времени. 4) для отладки приложения очень полезно вести лог выполнения SQL запросов. Просто писать в текстовый файл на диске все SQL выражения, которые выполняются приложением. Причем если приложение многопоточное - то для каждого потока/соединения в свой файл. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2004, 13:51 |
|
Принципы проектирования соединений клиентов (C# & ADO.Net & MSSQL2K)
|
|||
---|---|---|---|
#18+
A еще лучше - создавать класс не только для соеденения, а для всех операций с данным, т.е. Data Access Layer. Отдельный класс, который будет сам управлять соеденениями, сохранять данные, делать выборки и т.д. Т.е. в общем случае структура приложения такова : UI->Bisness Rules Layer->Data Access layer. Интерфейс вызывает методы основного класса, например Save(), далее следует проверка бизнес логики и вызов Save() из DAL. ЗЫ Инкапсуляция, инкапсуляция, инкапсуляция.... Magnus ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2004, 14:05 |
|
Принципы проектирования соединений клиентов (C# & ADO.Net & MSSQL2K)
|
|||
---|---|---|---|
#18+
2 Magnus23 Как говаривал Хам Трамвайный - как приятно послушать умных людей:) А ещё лучше делать ремотинг - тогда на клиенте в общем случае кроме фреймворка ничего ставить не надо - особенно, когда приложение одновременно может работать с разными СУБД. Ведь отсоединённые датасет это же такой мощный инструмент - зачем конекшн держать ПОСТОЯННО - ума не приложу.... ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2004, 14:19 |
|
Принципы проектирования соединений клиентов (C# & ADO.Net & MSSQL2K)
|
|||
---|---|---|---|
#18+
Alexey KudinovЯ не увидил у автора треда упоминаний о многопоточном приложении или асинхронных операциях. Т.е. можно обойтись и одним экземпляром, просто открывая/закрывая соединение. Я так же не увидел упоминаний о немногопоточности... просто общий случай. Понятно, что случаи могут быть разные. Alexey Kudinov 3) желательно всегда точно знать сколько соединений с СУБД у вас открыто в любой произвольно взятый момент времени. Для чего, если не секрет? Alexey Kudinov 4) для отладки приложения очень полезно вести лог выполнения SQL запросов. Просто писать в текстовый файл на диске все SQL выражения, которые выполняются приложением. Причем если приложение многопоточное - то для каждого потока/соединения в свой файл. Вероятно, ты хотел сказать, что для каждого "логического" соединения свой файл, а еще точнее, для каждого сервера. Иначе файлов наплодится... ;-) -- WBR, Roman S. Golubin -- Стек легко преобразуется в очередь при помощи автомата Калашникова. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2004, 16:09 |
|
Принципы проектирования соединений клиентов (C# & ADO.Net & MSSQL2K)
|
|||
---|---|---|---|
#18+
Ну а время на открытие конекшена? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2004, 16:18 |
|
Принципы проектирования соединений клиентов (C# & ADO.Net & MSSQL2K)
|
|||
---|---|---|---|
#18+
2 Roman S. Golubin Для чего, если не секрет? Для "прозрачности". Для поиска ошибок и проблем. Причем это больше связано с проблемами, которые могут возникнуть на стороне сервера, чем на стороне клиента. Блокировки, deadlock-и. Когда приложение начинает со страшной силой размножать соединения, его трудно отлаживать и зачастую трудно администрировать (на сервере). Т.е. когда я говорил "точно знать", я не имел ввиду держать в программе какой-то счетчик открытых соединений, а хорошо понимать (програмисту) сколько соединений открыто и зачем. Вероятно, ты хотел сказать, что для каждого "логического" соединения свой файл, а еще точнее, для каждого сервера. Иначе файлов наплодится... ;-) Тут зависит от того, а сколько этих потоков. Если их 3-4 - то для для каждого потока. А если их 300-400 - то да, как-то логически объединять. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2004, 16:32 |
|
Принципы проектирования соединений клиентов (C# & ADO.Net & MSSQL2K)
|
|||
---|---|---|---|
#18+
ВопросНу а время на открытие конекшена? Как уже говорили, елси использовать пулинг - практически равно нулю. Да, даже если и без пулинга. Я так во всех проэктах делаю. И не разу еще небыло проблем из-за не обходимости открывать каждый раз соеденение. Одно дело затраты на открытие соеденения и другое дело затраты ресурсов с обоих сторон(и сервера и клиента) на его поддержку. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2004, 16:33 |
|
Принципы проектирования соединений клиентов (C# & ADO.Net & MSSQL2K)
|
|||
---|---|---|---|
#18+
Спасибо всем! Тема коннекта раскрыта :) 2 Roman S. Golubin А под "пользовательскими контролами" я имел ввиду некие универсальные контролы, пользуемые во множестве проектов, например выбор элемента справочника. Им тож надо показывать куда подключаться и откуда данные брать... ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2004, 17:39 |
|
Принципы проектирования соединений клиентов (C# & ADO.Net & MSSQL2K)
|
|||
---|---|---|---|
#18+
Alexey Kudinov 4) для отладки приложения очень полезно вести лог выполнения SQL запросов. Просто писать в текстовый файл на диске все SQL выражения, которые выполняются приложением. Причем если приложение многопоточное - то для каждого потока/соединения в свой файл. Про profiler слышали? А про transaction log? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2004, 19:45 |
|
Принципы проектирования соединений клиентов (C# & ADO.Net & MSSQL2K)
|
|||
---|---|---|---|
#18+
funikovyuri Alexey Kudinov 4) для отладки приложения очень полезно вести лог выполнения SQL запросов. Просто писать в текстовый файл на диске все SQL выражения, которые выполняются приложением. Причем если приложение многопоточное - то для каждого потока/соединения в свой файл. Про profiler слышали? А про transaction log? Вероятно имелось ввиду, что подобный лог можно использовать для симуляции ошибок в дополнение к баг-репорту юзеров. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2004, 20:13 |
|
Принципы проектирования соединений клиентов (C# & ADO.Net & MSSQL2K)
|
|||
---|---|---|---|
#18+
Magnus23 funikovyuri Alexey Kudinov 4) для отладки приложения очень полезно вести лог выполнения SQL запросов. Просто писать в текстовый файл на диске все SQL выражения, которые выполняются приложением. Причем если приложение многопоточное - то для каждого потока/соединения в свой файл. Про profiler слышали? А про transaction log? Вероятно имелось ввиду, что подобный лог можно использовать для симуляции ошибок в дополнение к баг-репорту юзеров. В т.ч. и для этого. Просто это действительно очень удобно - работает приложение, а ты сидишь и смотришь в Far-e на файлик, как там запросы бегут. Многое гораздо легче отлаживается. Кроме того, его можно запустить и в собранном приложении регулируя включение/выключение лога например настройкой в реестре. И у пользователей для диагностики. По поводу профайлера, ODBC логирования и прочих стандартных средств - это не замена им, а в дополнение. Да и стандартные средства не всегда доступны. Использовал во многих проектах, неизменно доволен. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2004, 20:42 |
|
Принципы проектирования соединений клиентов (C# & ADO.Net & MSSQL2K)
|
|||
---|---|---|---|
#18+
HummerА ещё лучше делать ремотинг - тогда на клиенте в общем случае кроме фреймворка ничего ставить не надо - особенно, когда приложение одновременно может работать с разными СУБД. Да, но речь шла о подключении клиентов MSSQL, насколько я понял. И при чем тут ремотинг? Или ты знаешь, как через ремотинг к MSSQL подключаться? А при подключении клиента к серверу приложения - да, .Net remoting рулит. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2004, 10:05 |
|
Принципы проектирования соединений клиентов (C# & ADO.Net & MSSQL2K)
|
|||
---|---|---|---|
#18+
2 Roman S. Golubin Не совсем понял - я и имел в виду сервер приложений, к которому коннектиться клиент, а сам сервер уже отдаёт клиенту данные по запросу. Именно поэтому и написал про разные СУБД - получаем выигрыш в простоте распространения программы... Может просто выразился неточно. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2004, 11:14 |
|
Принципы проектирования соединений клиентов (C# & ADO.Net & MSSQL2K)
|
|||
---|---|---|---|
#18+
2 Hummer: А я имел в виду сервер приложений, который коннектится к MSSQL ;-)) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2004, 11:26 |
|
Принципы проектирования соединений клиентов (C# & ADO.Net & MSSQL2K)
|
|||
---|---|---|---|
#18+
2 Roman S. Golubin :) Ну дык и я о том же - классическая трёхзвенка.... ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2004, 11:29 |
|
Принципы проектирования соединений клиентов (C# & ADO.Net & MSSQL2K)
|
|||
---|---|---|---|
#18+
Вновь возвращаюсь к этой теме, т.к. начал разбираться с Microsoft Data Access Application Block for .NET Вроде как это и есть Data layer, и вроде как удобно. Пока. А кто-нибудь использует его в своих проектах? Достаточно функциональности или приходится дописывать Data retrieving в обход этого класса? Поделитесь, плиз. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2004, 09:20 |
|
Принципы проектирования соединений клиентов (C# & ADO.Net & MSSQL2K)
|
|||
---|---|---|---|
#18+
Как показывает практика, практически ни одно готовое решение не удовлетворяет на 100%. Использую в текущем проекте несколько AppBlock'ов, и все приходилось немного докручивать/дописывать. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2004, 10:44 |
|
Принципы проектирования соединений клиентов (C# & ADO.Net & MSSQL2K)
|
|||
---|---|---|---|
#18+
Всем привет. Я из вашего спора так и не понял какой вариант лучше. У меня проект построен на двухзвенке. Список объетов обновляется по таймеру. Создан отдельный класс для соединения со сервером MSSQL и чтения данных. Изначально открывал соединение, после выполнения команд закрывал. Но с таймером переполняется пул, а так предполагаю, что соединение долго закрывается. Пробывал держать одно постоянно открытое соединение, конфликт получается при мультипоточности. То есть надо постоянно держать открытое соединение для каждого потока. Подскажите как выйти из ситуации. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2013, 10:08 |
|
Принципы проектирования соединений клиентов (C# & ADO.Net & MSSQL2K)
|
|||
---|---|---|---|
#18+
Евгений_leaНо с таймером переполняется пул, а так предполагаю, что соединение долго закрывается.С чего вдруг такие выводы? Евгений_leaПробывал держать одно постоянно открытое соединение, конфликт получается при мультипоточности.Используйте lock . ... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2013, 17:48 |
|
|
start [/forum/topic.php?all=1&fid=20&tid=1403629]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
50ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
2ms |
others: | 13ms |
total: | 160ms |
0 / 0 |