Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.07.04;
Скачать: [xml.tar.bz2];

Вниз

Научите меня быть умным! (.NET) Отсоединенное соединение.   Найти похожие ветки 

 
Курдль ©   (2004-06-04 09:20) [0]

...или отключенное подключение :)
На самом деле вопрос очень важный! Ведь при переходе на Delphi 8 и технологию .NET возникает крушение стереотипов!
Видимо придется проститься со старыми принципами подключения к БД. Например, как раньше, - открыть приложение, совершить типа DataBase.Connection.Open, поработать и в конце дня сделать DataBase.Connection.Close - непозволительная роскошь!
Вот и вопрос. Кто может поделиться материалами, ссылками, опытом по созданию проектов .NET в части касающейся работы с Connection-ами?


 
Polevi ©   (2004-06-04 09:40) [1]

там все просто с коннекшнами

открыли
выбрали данные
закрыли

работаем с данными

открыли
запостили изменения
закрыли


 
Курдль ©   (2004-06-04 09:49) [2]

А существуют ли рекомендации лучших собаководов типа "MS настоятельно советует делать так:..."
Мне надо по максимуму аргументировать!


 
Mike_Goblin ©   (2004-06-04 09:53) [3]

существует документация и примеры
PS все гораздо хуже
создали объект соединения, подключились, получили/отправили данные, отключились, убиди объект.


 
Курдль ©   (2004-06-04 10:05) [4]


> Mike_Goblin ©   (04.06.04 09:53) [3]
> существует документация и примеры

Пожалуйста! Любую ссыдку - хоть на книжки, хоть по авторам!
А то вся литература весьма поверхностна и чаще всего повторяется!


> создали объект соединения, подключились, получили/отправили
> данные, отключились, убили объект.

Это, вроде как, понятно. Но дело в том, что иногда возникает сложная цепочка обновлений, вызываемая разными модулями (формами), но находящаяся внутри одной транзакции.
В то же время, по стилю .NET каждой форме желательно иметь по собственному Connection. Как в таком случае объять всё одной транзакцией?


 
ZrenBy ©   (2004-06-04 10:17) [5]

>Курдль ©  

Гы. Вспоминается спор о транзакциях :)


 
Курдль ©   (2004-06-04 10:19) [6]


> ZrenBy ©   (04.06.04 10:17) [5]
> >Курдль ©  
> Гы. Вспоминается спор о транзакциях :)

Да-да!  :)  Но это именно тот случай, когда бе них не обойтись.
Т.е. когда производится большое количество последовательных обновлений (задействовано несколько таблиц, процедур, срабатывали триггеры) и все это должно быть либо корректно утверждено, либо начисто откачено.


 
Polevi ©   (2004-06-04 10:27) [7]

по стилю .NET каждой форме желательно ..
причем тут формы вообще ? учись отделять данные от их представления
connection динамически создавай

public void UpdateData(String sql)
{
 SqlConnection conn=new SqlConnection(ConnString);
 try
   conn.Open();
   SqlTransaction tran=conn.BeginTransaction(IsolationLevel.Serializable);
   SqlCommand cmd=new SqlCommand();
   cmd.Connection=conn;
   cmd.Transaction=tran;
   cmd.CommandText=sql;
   cmd.ExecuteNonQuery();
   tran.Commit();
 catch
 {
   if(tran!=null)
     tran.RollBack();
 }
 finally
   conn.Close();
 end;
}

и посмотри DataAdapter


 
Курдль ©   (2004-06-04 10:52) [8]

В данном случае, как раз, использование транзакции не оправдано.

А отделять данные от их представления не так-то просто.
Ведь идеология делфей въелась намертво! :)


 
Sergey_Masloff   (2004-06-04 13:36) [9]

Курдль ©   (04.06.04 10:52) [8]
>А отделять данные от их представления не так-то просто.
Да и часто не так-то нужно как это представляется в умных книжках ;-)


 
Polevi ©   (2004-06-04 13:37) [10]

>В данном случае, как раз, использование транзакции не оправдано.
это откуда такой вывод последовал интересно


 
Курдль ©   (2004-06-04 14:03) [11]


> это откуда такой вывод последовал интересно

Да от того же верблюда, что и TQuery.ExecSQL:
cmd.ExecuteNonQuery(); по умолчанию открывает транзакцию неявно, утверждает ее в случае успеха и откатывает по ошибке.


 
Polevi ©   (2004-06-04 14:57) [12]

>по умолчанию открывает транзакцию неявно
не люблю я эти неявно.. по умолчанию
и вам советую


 
Курдль   (2004-06-04 15:02) [13]


> и вам советую

И напрасно!

если есть код
begin
a := b;
end;
то зачем писать
begin
 begin
  a := b;
 end;
end;

?


 
Delirium ©   (2004-06-04 15:05) [14]

"открыть приложение, совершить типа DataBase.Connection.Open, поработать и в конце дня сделать DataBase.Connection.Close - непозволительная роскошь!" - Гхм, а все ваши существующие win32-приложения постоянно держат коннект с базой? В таком случае настоятельно рекомендую поскорее "крушить стереотипы"! Ибо не правильно сие не только для .Net, но и для любой другой платформы.


 
Курдль   (2004-06-04 15:10) [15]


> а все ваши существующие win32-приложения постоянно держат
> коннект с базой?

А спрогнозируйте-ка поведение данных в связке DBGrid-DataSource-DataSet-DataBase, если кому-то из последних сделать close?


 
Delirium ©   (2004-06-04 15:16) [16]

Вы меня не понимаете я вижу, сама связка "DBGrid-DataSource-DataSet-DataBase", уже порочна. Нельзя превращать приложение в on-line редактор для БД. Так делают лишь для локальных DBF-таблиц, да и то редко. Использование ADO в том числе и старого, подразумевает толстого клиента, собственно для и этого и придуман "ADODB.Recordset" - для возможности "отвязаться" от сервера.


 
Polevi ©   (2004-06-04 15:17) [17]

> [15] Курдль   (04.06.04 15:10)
это зависит от датасета

> и вам советую
>И напрасно!
если вы знаете все лучше всех, зачем задвать вопросы в форуме, учитель ?


 
Delirium ©   (2004-06-04 15:24) [18]

По поводу литературы:http://www.gotdotnet.ru/LearnDotNet/ADONET/default.aspx
читайте, учитесь, не спешите воспринимать свои личные подходы как истину последней инстанции.


 
Курдль   (2004-06-04 15:35) [19]


> Вы меня не понимаете я вижу, сама связка "DBGrid-DataSource-DataSet-DataBase",
> уже порочна. Нельзя превращать приложение в on-line редактор
> для БД. Так делают лишь для локальных DBF-таблиц, да и то
> редко. Использование ADO в том числе и старого, подразумевает
> толстого клиента, собственно для и этого и придуман "ADODB.Recordset"
> - для возможности "отвязаться" от сервера.


1. Указанную связку я привел, как наиболее наглядную.
2. Использование ADO было отвергнуто нами пару лет назад, как крайне неудобное и опасное. Надеюсь, что в ADO.NET исправят.
3. Компоненты "Direct Oracle Access" или "SQL Direct" (наиболее профессиональные из всех, что существуют для Delphi) предполагают именно работу с открытым коннектом.


 
Polevi ©   (2004-06-04 16:04) [20]

>как крайне неудобное и опасное
можно поподробнее


 
Delirium ©   (2004-06-04 16:21) [21]

"Использование ADO было отвергнуто нами пару лет назад, как крайне неудобное и опасное" - ну насмешил :) Не могу не тыкать клоуну, считающему себя умнее идеологов Miicrosoft.


 
Delirium ©   (2004-06-04 16:28) [22]

Написал бы честно: "Не умею работать с ADO, учиться - лень, взял что попало под руку и стал ваять, а теперь, когда софта наворочал - переходить тяжело", а то  - "наиболее профессиональные"! Т.е. типа в состоянии оценить профессианолизм решения, а вот научиться ADO пользоваться по человечески - не можешь.


 
Курдль   (2004-06-04 22:01) [23]


> Не могу не тыкать клоуну, считающему себя умнее идеологов
> Miicrosoft.

А Вы не идеолог, случаем? Им всегда было очень легко, как например идеологам отечественного автомобилестроения :)
Дело не в идеологах, а в реализаторах от Борланда!
Если, конечно, делать программы - записные книжки или тесты для школы, то можно и не подозревать, зачем у профессиональных датасэтов есть свойство "OnApplyRecord", которого нет у ADO, как и многих других.


 
Sergey Masloff   (2004-06-04 22:53) [24]

Delirium ©   (04.06.04 15:16) [16]
>для возможности "отвязаться" от сервера.
Да только не всегда это нужно. В смысле отвязываться. Есть какие-то доводы в пользу этого решения кроме рекомендаций "идеологов Майкрософт"? Вернее, доводы, конечно есть но всегда ли они работают?
 В случае локальной сети особого смысла в закрытии коннекта нет. Нагрузку он дает только на момент реального обмена данными, ну так и в случае отсоединенного датасета нужно обмен с базой производить - никуда не дется коннект нужен. Так и чего его дергать туда-сюда? Реальная нагрузка от открытого коннекта ничтожна, даже на Win-платформе Oracle не напрягаясь держит полторы-две тысячи коннектов. Минимизировать обмен данными позволяют и другие технологии, те же кэшированные изменения и так далее. Но при высокой интерактивности приложения и когда большинство действий пользователя связаны с обращениям к серверной бизнес-логике то постоянно открытый коннект может быть весьма удобен.
 Так что я попросил бы привести пару-тройку наглядных реальных примеров того что отсоединенный рекордсет это единственное возможное решение на все случаи жизни. Только не надо общих слов и ссылок на рекомендации идеологов - эти рекомендации хорошо известны но не всегда их стоит воспринимать как истину в последней инстанции.


 
Sergey Masloff   (2004-06-04 22:58) [25]

Добавлю что работа по технологии отсоединенных данных мне известна не понаслышке, в том числе я реализовал в такой технологии минимум два проекта (без использования ADO - на собственной реализации связки объектной модели с РСУБД) - один эксплуатируется уже порядка шести лет, другой три года (порядка полутора тысяч инсталляций) - и должен сказать что у этой технологии (как и у всех остальных) достаточно как плюсов так и минусов, так что называть всех не придерживающихся такой технологии различными нелестными эпитетами как минимум странно.


 
Fay ©   (2004-06-04 23:21) [26]

Впервые слышу об этих хорошо известных рекомендациях...
Мне уже пора на свалку? 8(


 
Курдль   (2004-06-04 23:54) [27]


> Fay ©   (04.06.04 23:21) [26]
> Впервые слышу об этих хорошо известных рекомендациях...
> Мне уже пора на свалку? 8(

Вам тоже NASA не приходилось автоматизировать? :)))
Это у них Оракл на 8000 коннектов работал еще до появления даже фантазий про ADO :)


 
Polevi ©   (2004-06-06 10:23) [28]

> [24] Sergey Masloff   (04.06.04 22:53)
>я попросил бы привести пару-тройку наглядных реальных примеров того что >отсоединенный рекордсет..
любая >2 звенная архитектура с stateless объектами


 
Polevi ©   (2004-06-06 10:25) [29]

проблема не колве открытх сессий на DB-Serverе, а в колве пользовательских объектов, которые их держат
stateless модель гораздо лучше масштабируется, это не надо доказывать, я надеюсь ?


 
Sergey Masloff   (2004-06-07 21:34) [30]

Polevi ©   (06.06.04 10:25) [29]
Давайте поконкретнее. Что у вас за пользовательские объекты которые что-то там держат. Открытые на сервере курсоры?
 Открытый запрос в режиме CashedUpdates на сервере ничего не держит. Да и без этого режима обычно не держит. Повторю - тысячи таких сессий сервер не особенно напрягают.
 Да, в трехзвенной архитектуре отсоединенные датасеты имеют смысл, в двухзвенке обычно-нет. Так как усложнение разработки и отладки, медленнее работа а реальных преимуществ - не особо-то видно...


 
Petr V. Abramov ©   (2004-06-07 22:11) [31]

> Открытый запрос в режиме CashedUpdates на сервере ничего не
> держит
 Ну курсор-то все он ж держит, хотя бы потому, что его могли "недофетчить" еще. Но это вопрос реализации. В идеале после выборки последней записи курсор можно было бы спокойно закрывать (на уровне OCI, и, соответственно, на сервере).

 Но если за Connection на самом деле стоят реальные хендлы и при открытии/закрытии оно все время логинится/отсоединяется - ну тогда фьюююююю - идеологи или грибов плохих поели, или не видят другого способа заставить покупать больше процессоров и памяти.
 Если же Connection просто закрывает курсор - ну тогда очень правильно делает.


 
Курдль   (2004-06-07 23:58) [32]


>  Но если за Connection на самом деле стоят реальные хендлы
> и при открытии/закрытии оно все время логинится/отсоединяется
> - ну тогда фьюююююю - идеологи или грибов плохих поели,
> или не видят другого способа заставить покупать больше процессоров
> и памяти.

Мои наблюдения со стороны сервера показали:
При "Cache Authentication=True" при каждом коннекте из текущего приложения на сервере регистрируется новое соединение с уникальным идентификатором. Ради интереса открывал 10 соединений - все 10 показались на сервере.
При дисконнекте всех соединений одно все равно остается висеть до тех пор, пока не закрывается приложение.
При "Cache Authentication=False" при последнем дисконнекте все соединения тухнут.


 
Petr V. Abramov ©   (2004-06-08 00:37) [33]

> все 10 показались на сервере.
> Научите меня быть умным! (.NET)
 Ну тогда такую умность скажу:
 Либо - в лучшем случае - Вы просто еще не научились работать с Connection`ами, и все не так плохо.
 Либо плюньте на это, потому как по 10 соединений будут открывать все программы, не только Ваша :)

> (.NET)
 Организованной толпой
 Коровы шли на водопой
 Попить воды  Бу-бу-бу-бу
 По-ть с кусты Бу-бу-бу-бум
:)


 
Petr V. Abramov ©   (2004-06-08 00:38) [34]

> по 10 соединений будут открывать
в смысле пересоединяться на каждый чих


 
Курдль ©   (2004-06-08 09:14) [35]


> Либо - в лучшем случае - Вы просто еще не научились работать
> с Connection`ами, и все не так плохо.

У меня несколько книг + инетовские примеры + визард VS по созданию дата-форм. И везде технология одинакова.
Откуда растут ноги - понятно. MS решил завалить Линукса, прикрыть SUN Java и навредить Ораклу посредством унификации подхода программирования доступа к данным. Естественно, при интернет-коннекте есть смысл отключаться как можно быстрее (т.е. проводить физический дисконнект). Это проецируется и на работу виндоуз-приложений.


 
Polevi ©   (2004-06-08 11:43) [36]

> [35] Курдль ©   (08.06.04 09:14)
инициатива .NET ориентирована на интернет



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2004.07.04;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.035 c
1-1087724570
killer
2004-06-20 13:42
2004.07.04
Меню состоящее из одних изображений?


11-1076271391
ecm
2004-02-08 23:16
2004.07.04
Menu и изменение DefaultItem


14-1086581801
Zoom Evstrahiev
2004-06-07 08:16
2004.07.04
Народ! Потестите програмку!


8-1082305824
ARY
2004-04-18 20:30
2004.07.04
Анимация велосипеда.


1-1087497524
lelik
2004-06-17 22:38
2004.07.04
свойства файла





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский