Конференция "Базы" » проблемки с TAdoConnection... [D7, MSSQL]
 
  • guest (01.03.12 00:34) [0]
    В программе используется объект TAdoConnection  для работы с бд скл сервера. Иногда после долго работы (многочисленных вызовов хранимок бд, шатдаунов скля (когда идут бекапы)) объект TAdoConnection выдает access violation при обращении к нему (попытка вызова Close), хотя  я его освобождаю только в destroy приложения (верне сервиса). Close могу юзать часто, при различных возможных ошибках соединения (например недоступность скля), чтобы инициировать реконнект..

    вопросы:
    - правильно ли так использовать TAdoConnection?
    -почему может падать объект?
    -что делать чтобы этого не было (или такое бывает и он корректно освобождается и нужно лишь пересоздать его..) ?
  • Ega23 © (01.03.12 00:45) [1]

    > -почему может падать объект?


    Если именно AV и именно при обращении к TADOConnection, то стопудово объект уже уничтожен.
    Смотри, где идут вызовы деструктора. Сам явным образом убиваешь, убиваешь владельца (Owner) и т.д.
  • istok20 © (01.03.12 00:52) [2]

    > Сам явным образом убиваешь, убиваешь владельца (Owner) и
    > т.д.


    ох непросто это... этот сервис 7 дней проработал до этой ошибки делая всевозможные манипуляции с данными... но никогда явно не освобождая конекшн.

    конекшн часто используется в для вызова хранимок и передается в соответствующее свойство, т.е. код вида:

    var
     storedProc: TADOStoredProc;
    begin
     storedProc := TADOStoredProc.Create(nil);
     try
       with storedProc do
       begin
         Connection := FConnection;
         ...
       end;
      finally
        storedProc.Free;
      end;



    но ведь  storedProc.Free; не вызовет освобождения моего объекта конекшена? это было бы слишком заметно)

    и как может смениться owner при  FConnection := TADOConnection.Create(nil);  ??
  • istok20 © (01.03.12 00:54) [3]
    я конечно поставлю заплатку и на случай убитого adoconnection, пересоздам его (предварительно пытаясь сделать freeandnil в try..except). но не породит ли это утечку ?
  • Германн © (01.03.12 01:43) [4]

    > ох непросто это... этот сервис 7 дней проработал до этой
    > ошибки делая всевозможные манипуляции с данными... но никогда
    > явно не освобождая конекшн.
    >

    Никогда не говори никогда.
  • sniknik © (01.03.12 08:03) [5]
    > только в destroy приложения (верне сервиса).
    сервис это поток... создание/уничтожение делается в основном потоке, работа (execute) же в нем самом.
    для роботы ADO нужно инициализировать com модель для каждого потока, или в каком то модуле само, для основного.
    что произойдет если инициализация/закрытие модели (основы) происходит в дополнительном, а надстройки в основном после закрытия основы? AV точно может. а редко потому что память занимаемая объектами не моментально затирается, а может висеть еще какое то время. типа объект призрак.

    в общем не вали на ADO, а проверь тщательнее свой код.

    и еще
    > TADOStoredProc
    ... ... .... слов уже нет.
  • AV © (01.03.12 10:06) [6]
    переписать все на property Connection:TADOCONNECTION read FConnection
    сам FConnection скрыть, что ни одна собака без property не достучалась

    , на set этого проперти поставить проверку на валидности / логатор / соли по вкусу
  • sniknik © (01.03.12 10:21) [7]
    AV ©   (01.03.12 10:06) [6]
    это называется "замазать глюк", вместо разбора/искоренения причин.
    и к тому же не поможет если проблема не в отсутствии/уничтоженности объекта (к стати если без обnilения, тоже), а в чем-то связанном типа [5] первый абзац.
  • guest (01.03.12 12:16) [8]

    > и еще
    > > TADOStoredProc
    > ... ... .... слов уже нет.


    можете пояснить плиз?
  • sniknik © (01.03.12 12:22) [9]
    как? без слов то...
    ну, если коротенько... это атавизм сделанный для привыкших к BDE для быстрого перевода. в "чистом" ADO такого понятия нет. процедуры есть, а вот StoredProc нет.
    в общем, это признак ламеризма для тех кто понимает.
  • istok20 © (01.03.12 12:22) [10]

    > sniknik ©   (01.03.12 08:03) [5]

    в основном потоке сервиса при старте делается
    CoInitializeEx(nil, COINIT_MULTITHREADED);

    другие потоки юзят свои конекшены (с предварительным вызовом CoInitialize(nil);), между потоками конекшены не шарятся.
  • istok20 © (01.03.12 12:26) [11]

    > в общем, это признак ламеризма для тех кто понимает.

    а как надо? покажете эталонный пример работы с хранимкой?

    и является атавизм столь критичным, если получая результат хранимок я бегаю по рекордсетам, а не датасетам, избегая навигационных тормозов..?
  • sniknik © (01.03.12 12:28) [12]
    на словах все чудно, но слова мало, что говорят... о происходящей реальности.
  • sniknik © (01.03.12 12:32) [13]
    > а как надо? покажете эталонный пример работы с хранимкой?
    нет. меня это уже давно "достало". хочешь поищи в старом. или в справке ... по ADO, это не в дельфи.

    > если получая результат хранимок я бегаю по рекордсетам, а не датасетам, избегая навигационных тормозов..?
    ламеризм. как есть ламеризм. в чем по твоему разница? и откуда берутся "навигационные тормоза"? не думал о том чтобы их уволить? :)
  • istok20 © (01.03.12 12:38) [14]
    если кто-то готов проинспектировать код и найти первоисточник причины за достойную оплату, пишите: alex_for_chat@mail.ru

    (организуем удаленное соединение с нашим ПК с делфей)
  • guest (27.06.12 13:50) [15]
    Обнаружил многопоточное использование TADOCONNECTION, вопрос - критич. секциями это можно разруливать или же строго по конекшену на поток делать?
  • sniknik © (27.06.12 14:11) [16]
    > или же строго по конекшену на поток делать?
    проще.

    а по идее можно и вообще без критических секций и т.д... НО, придется перейти на прямое использование COM объектов ADO, без VCL-ных оберток.
    в чистом виде ADO потокобезопасен... но, без этого никак, 1 коннект будет ставить запросы в очередь... если конечно не делать их асинхронными, а если сделать то потоки не нужны, но нужна очередь обработки сообщений (усложнение в потоке). такой вот парадокс.
  • Anatoly Podgoretsky © (27.06.12 14:30) [17]

    > или же строго по конекшену на поток делать?

    А это смотря что хочешь получить, с несколькими соединениями проблем обычно меньше и запросы могут выполняться паралельно, а не становиться в очередь.

    С одним выше надежность
 
Конференция "Базы" » проблемки с TAdoConnection... [D7, MSSQL]
Есть новые Нет новых   [119683   +127][b:0][p:0.001]