|
Принципы проектирования соединений клиентов (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 |
|
|
start [/forum/topic.php?fid=20&msg=32747353&tid=1403629]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
61ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 169ms |
0 / 0 |