Конференция "Базы" » приложение зависает при обращении к Firebird. что делать помогите [D7, IB6.x]
 
  • Tepex © (05.11.08 14:29) [0]
    Доброго времени суток всем. Проблема в следующем есть сервер firebird и к нему подключаются клиенты и бывает так что иногда обращаешься к записи чтобы ее считать и приложение зависает. В чем может быть проблема? может быть другие пользователи обращаются к записям и блокируют их?
  • Sergey13 © (05.11.08 14:40) [1]
    Иногда и хуже бывает. На все свои причины при своих условиях.
  • Tepex © (05.11.08 15:05) [2]

    > Иногда и хуже бывает. На все свои причины при своих условиях.

    что ты этим хотел сказать?
  • Sergey13 © (05.11.08 15:28) [3]
    А что ты хотел сказать своим постом? Что-то, где-то, когда-то работает не так как хочется?
  • Правильный$Вася (05.11.08 15:35) [4]
    > иногда обращаешься к записи чтобы ее считать и приложение зависает
    код давай
  • Sergey13 © (05.11.08 15:48) [5]
    > [4] Правильный$Вася   (05.11.08 15:35)
    > код давай

    Может и не в коде дело, а в том, например, что сервер это "сервер" и по совместительству рабочая машина какого нибудь геймера. 8-)
  • PEAKTOP © (05.11.08 16:58) [6]
    > Sergey13 ©   (05.11.08 15:48) [5]
    > Может и не в коде дело, а в том, например, что сервер это "сервер" и по совместительству рабочая машина какого нибудь геймера. 8-)


    Ставлю 80% на параметры транзакции INSERT и еще 15% на сборку мусора SWEEP (если подключение происходит в 2 часа ночи и это единственный клиент в данный момент времени).
  • Tepex © (05.11.08 23:18) [7]
    Вообщем есть программа написанная на Delphi исходников нет поэтому не могу посмотреть что там происохдит, т.е является черным ящиком, она работает с БД, и есть обработка в 1С при помощи которой выгружаются данные которые создаются программкой на Delphi. Обработка из 1С как я понял подключается к базе данных через COM объект и использует ADO. Подключение происходит нормально, выгрузка данных, происходит нормально, но иногда после закрытия обработки и вновь ее открытия и запуска зависает, и не работает не nowait, не timeout которые установлены. Может ли быть так что клиенты из под Delphi приложения блокируют таблицы и можно ли их как то разблокировать?
    P.S клиентов 10.
    консультации по 1С не стоит давать я могу спросить и на другом форуме.
    Интересует ответы только по поводу FireBird и ADO компонент
  • Сергей М. © (06.11.08 08:27) [8]

    > есть программа написанная на Delphi исходников нет


    > Обработка из 1С как я понял


    Хм ..
    К разработке Делфи-приложения ты не имеешь отношения, 1С-обработку тоже не ты писал .. Возникает резонный вопрос - какое отношение к программингу вообще ты имеешь ? Т.е. даже если причина "беды" будет локализована, как ты сможешь повлиять на ее устранение ?
  • Сергей М. © (06.11.08 08:34) [9]

    > обработка в 1С при помощи которой выгружаются данные


    Куда выгружаются ?
  • Tepex © (06.11.08 09:17) [10]

    > Хм ..
    > К разработке Делфи-приложения ты не имеешь отношения, 1С-
    > обработку тоже не ты писал .. Возникает резонный вопрос
    > - какое отношение к программингу вообще ты имеешь ? Т.е.
    >  даже если причина "беды" будет локализована, как ты сможешь
    > повлиять на ее устранение ?


    Отношение к программированию я имею самое прямое. И как я буду влиять на устранение проблемы это тоже как бы мое дело.
    Данные выгружаются в из базы данных firebird в базу данных 1С.
    Строка соединения формируется следующим образом:
    Соединение = Новый COMОбъект("ADODB.Connection");
    Соединение.ConnectionString = "driver={Firebird/InterBase(r) driver};    |server=" + выбСервер + ";
      |uid=" + выбПользователь + ";                 |pwd=" + выбПароль + ";      |database=" + выбСервер   + ":" +выбПутьКБазе+ ";               |READONLY=1;
      |NOWAIT =1;
      |CursorType = ctForward-only;";
    Соединение.ConnectionTimeOut = выбВремяОжидания;
    Соединение.CursorLocation = "ltReadOnly";
    Соединение.Open();

  • Tepex © (06.11.08 09:38) [11]

    > > Хм ..
    > > К разработке Делфи-приложения ты не имеешь отношения,
    > 1С-
    > > обработку тоже не ты писал .. Возникает резонный вопрос
    >
    > > - какое отношение к программингу вообще ты имеешь ? Т.
    > е.
    > >  даже если причина "беды" будет локализована, как ты сможешь
    >
    > > повлиять на ее устранение ?
    >
    >
    > Отношение к программированию я имею самое прямое. И как
    > я буду влиять на устранение проблемы это тоже как бы мое
    > дело.

    от вас просто хочется услышать советов, а не нравоучений Господа
  • Сергей М. © (06.11.08 09:48) [12]
    Причем здесь "нравоучения" ?

    Если обработку писал лично ты, то следовало бы сразу привести фрагмент кода, а не вводить в заблуждение фразой "как я понял" ..

    Теперь по сути.

    Что показывает отладчик при пошаговой трассировке кода 1С-обработки ?
    На какой конкретно строчке происходит "вис" ?

    Судя по


    > обращаешься к записи чтобы ее считать и приложение зависает


    приведенный тобой код не имеет отношения к проблеме - в нем нет ни намека на работу с НД и транзакциями ..
  • Tepex © (06.11.08 10:03) [13]
    Пока Не ТаблицаБазы.EOF() Цикл  
     
    СтрокаИДЗаявок = СтрокаИДЗаявок + Формат(ТаблицаБазы.fields("orderid").Value,"ЧГ=") + ",";
     
    ТаблицаБазы.MoveNext();
     
    КонецЦикла;



    вообщем при получении данных из поля "orderid" обработка зависает и дальше ничего сделать не могу, приходится убивать процесс в диспетчере. Может быть с настройками самого firebird какие то проблемы или с подключением?
  • Сергей М. © (06.11.08 10:21) [14]
    А где у тебя настройка читающей транзакции и управление ей ?
  • Tepex © (06.11.08 10:43) [15]
    СтрокаСЗаявками = "";
    Для Каждого СтрокаИзСпискаЗаявок Из СписокЗаявок Цикл
    Если НЕ СтрокаИзСпискаЗаявок.Заявка.ПометкаУдаления Тогда
    СтрокаСЗаявками = СтрокаСЗаявками + "cast('\"+ ВРег(СокрЛП(СтрокаИзСпискаЗаявок.Заявка.Номер))+\"' as varchar(32)),";
    КонецЕсли;
    КонецЦикла;

    ТекстЗапросаИДЗаявок = "select * from orders where agreementno in (" + СтрокаСЗаявками + ")";

    Соединение = Новый COMОбъект("ADODB.Connection");
    Соединение.ConnectionString = "driver={Firebird/InterBase(r) driver};
             |server=" + выбСервер + ";
             |uid=" + выбПользователь + ";
             |pwd=" + выбПароль + ";
             |database=" + выбСервер + ":" + выбПутьКБазеАльтавин + ";
             |READONLY=1;
             |NOWAIT =1;
             |CursorType = ctForward-only;";
    Соединение.ConnectionTimeOut = выбВремяОжидания;
    Соединение.CursorLocation = "ltReadOnly";

    Соединение.Open();

    ТаблицаБазы = Новый ComОбъект("ADODB.RecordSet");

    ТаблицаБазы.Open(ТекстЗапросаИДЗаявок, Соединение);
    СтрокаИДЗаявок = "";
    Пока Не ТаблицаБазы.EOF() Цикл  
    СтрокаИДЗаявок = СтрокаИДЗаявок + Формат(ТаблицаБазы.fields("orderid").Value,"ЧГ=") + ",";
               ТаблицаБазы.MoveNext();
     
    КонецЦикла;



    Ну вообщем вот так вот все и формируется.
  • Sergey13 © (06.11.08 10:51) [16]
    > [7] Tepex ©   (05.11.08 23:18)
    > но иногда после закрытия обработки и вновь ее открытия и
    > запуска зависает, и не работает не nowait, не timeout которые
    > установлены.

    Закрытие и открытие имеется в виду перезапуск приложения или отдельной формы приложения? Может чего не так инициализируется?
  • Tepex © (06.11.08 10:58) [17]

    > > [7] Tepex ©   (05.11.08 23:18)
    > > но иногда после закрытия обработки и вновь ее открытия
    > и
    > > запуска зависает, и не работает не nowait, не timeout
    > которые
    > > установлены.
    >
    > Закрытие и открытие имеется в виду перезапуск приложения
    > или отдельной формы приложения? Может чего не так инициализируется?
    >


    Просто открываешь в 1С обработку, закрываешь обработку(не саму 1С) и снова через файл->открыть, открываешь обработку и запускаешь ее после это 1С виснет.
  • Sergey13 © (06.11.08 11:11) [18]
    > [17] Tepex ©   (06.11.08 10:58)
    > закрываешь обработку(не саму 1С)

    А если "саму 1С" закрыть/открыть, то все нормально? Значит что-то не до конца прибили, ИМХО.
  • sniknik © (06.11.08 11:16) [19]
    странно что и в первый раз то работает...
    не знаю как 1С так вообще работает, и зависит ли описанное от этого, но вот тут ошибка
    >
    Соединение.CursorLocation = "ltReadOnly";



    (автору кода не составит груда заглянут в доку и исправить)
  • Tepex © (06.11.08 11:17) [20]
    [18] Закрытие самой 1С помогает, но не всегда. Просто когда закрываешь обработку все переменные обнулются и становятся = неопределено, поэтому связь с ком объектом разрывается и он тоже убивается. в чем тогда может быть причина? ИМХО
  • sniknik © (06.11.08 11:19) [21]
    кстати я бы и это посчитал бы глюком, правда это не всегда "смертельно", от объема зависит, но всегда тормозно
    >
    СтрокаИДЗаявок = СтрокаИДЗаявок + Формат(ТаблицаБазы.fields("orderid").Value,"ЧГ=") + ",";

  • Tepex © (06.11.08 11:20) [22]
    [19] Ну убрал, толку не стало от этого вооще повисла обработка при первом запуске. Если я правильно понимаю то Соединение.CursorLocation = "ltReadOnly"; Это тоже самое что и в делфи ADOConnection.CursorLocation  = "ltReadOnly"; Или может я ошибаюсь?
  • sniknik © (06.11.08 11:22) [23]
    > Это тоже самое что и в делфи ADOConnection.CursorLocation  = "ltReadOnly";
    практически да, и дельфи это даже скомпилировать не даст.... насколько пинимаю.
  • Tepex © (06.11.08 11:23) [24]

    > кстати я бы и это посчитал бы глюком, правда это не всегда
    > "смертельно", от объема зависит, но всегда тормозно
    > > СтрокаИДЗаявок = СтрокаИДЗаявок + Формат(ТаблицаБазы.fields("orderid").
    > Value,"ЧГ=") + ",";

    И как надо написать правильнее?
  • Tepex © (06.11.08 11:28) [25]
    [23] Извени перепутал конечно это чушь. Просто сейчас под рукой нет Делфи
  • sniknik © (06.11.08 11:30) [26]
    > И как надо написать правильнее?
    смотря для чего/что делается, если нужна именно строка то память обычно правильно выделять под неё полностью, и куски "вкопировать"  на места. а то что есть будет черезчур часто перераспределять память под строку. что и приведет к тормозам, если же строка превысит какой то объем (теоретически 2гига но практически меньше) то к нехватке памяти и/или глюку.
  • sniknik © (06.11.08 11:34) [27]
    > Извени перепутал конечно это чушь.
    тогда вопрос... а что именно мы тут обсуждаем? если приведённый код не рабочий, приведён "по памяти" и является чушью... как именно ты хочешь найти ошибку.

    это все одно что для ремонта одного авто в авто мастерскую пригнать другое, но говорить все таки про первое (и главное ожидать, что отремонтируют именно его)...
  • Tepex © (06.11.08 11:40) [28]
    код привден верно работало даже с этой строкой, хотя она не правильная, спасибо за то что указал. Писал код не я, есть проблема с зависанием и мне ее к сожалению приходится решать.
  • sniknik © (06.11.08 11:46) [29]
    ну так, если там допущена такая ошибка... то нужно пересматривать весь код, очевидно писалось без  понимания процесса.
  • Tepex © (06.11.08 11:53) [30]
    [29] Пересматривал код весь процесс проходит нормально, а вот в куске который я написал происходит зависание системы. может проблема в настройке самой СУБД? Или программа написанная на Делфи блокирует таблицы в чем проблема может быть?
  • Сергей М. © (06.11.08 11:54) [31]

    > Tepex ©   (06.11.08 11:40) [28]


    А что мешает отказаться от доступа к базе через ADO непосредственно в обработке в пользу доступа через дельфийские компоненты прямого доступа в 1С-надстройке ?
  • Сергей М. © (06.11.08 12:07) [32]
  • sniknik © (06.11.08 12:08) [33]
    > Пересматривал код весь процесс проходит нормально, а вот в куске который я написал происходит зависание системы.
    ну да...

    st:=  StringList.Text;
    вот кусок в котором процесс (передача текста в переменную) проходит нормально.

    после гденибудь в другом месте делаем StringList.Free, тоже что характерно совершенно нормально.

    потом пытаемся выполнить первый "нормальный" кусок второй раз...
  • sniknik © (06.11.08 12:10) [34]
    > http://delphi-faq.zoxt.net/363.htm
    это немного не то, это к к рекордсету... лучше обратиться к документации.
  • Сергей М. © (06.11.08 12:31) [35]

    > не то, это к к рекордсету


    Судя по авторскому


    > обращаешься к записи чтобы ее считать и приложение зависает


    проблемы как раз при работе с НД
  • Tepex © (06.11.08 13:59) [36]
    [35] Извените конечно но что значит НД?
  • Сергей М. © (06.11.08 14:06) [37]
    НД = Набор Данных
  • Tepex © (06.11.08 14:12) [38]
    Ну так где копать надо начинать Уважаемые?
  • Сергей М. © (06.11.08 14:36) [39]
    [32] проштудировал ?
  • Tepex © (06.11.08 14:59) [40]
    Да вроде все понятно. Ничего нового не нашел.
  • sniknik © (06.11.08 15:01) [41]
    > Ну так где копать надо начинать Уважаемые?
    исправить уже найденные ошибки, почитать документацию, и пересмотреть весь код ещё раз.
  • Сергей М. © (06.11.08 15:13) [42]

    > Ничего нового не нашел


    Неужели ?!
  • Tepex © (06.11.08 15:20) [43]
    Ну да я это уже читал до того как создать тему. Ну так какие могут быть предложения?
  • Сергей М. © (06.11.08 15:30) [44]
    А какие м.б. предложения ?
    Сетевые условия взаимодействия с IB-сервером и с хостом, на котором он размещен, ты так и не детализировал ..
    А от них многое зависит ..
  • Сергей М. © (06.11.08 15:37) [45]
    Опять же есть сомнения в эффективности выполнения запроса, который возвращает тебе НД - к использованию статьи
    IN

    следует подходить с полным пониманием происходящего ..
  • Tepex © (06.11.08 15:42) [46]
    [44] да соединение с сервером FB происходит через TCP/IP протокол, настройки самого FB по умолчанию. Машина на которой расположен сервер FB Intel Xeon 3.20 GHz, подключатся одновременно могут 10 клиентов. Вот такое взаимодействие с сервером FB.
  • Сергей М. © (06.11.08 15:45) [47]

    > Tepex ©   (06.11.08 15:42) [46]


    Этих сведений не достаточно для принятия решения о применении того или иного типа курсора. И в статье на это сделан довольно внятный акцент.
  • Сергей М. © (06.11.08 15:47) [48]
    Неизвестно также в каком режиме работает IB-сервер - CS или SS..
  • Tepex © (06.11.08 16:00) [49]
    [48] не могу посмотреть в данный момент в каком режиме работает. Насчет IN. что предлагаешь использовать в замен этой статьи?
  • Сергей М. © (06.11.08 16:15) [50]
    Об эффективности IN можно рассуждать лишь зная подробности плана запроса, используемого сервером при исполнении этого запроса .. Ты их тоже не привел ..
  • Сергей М. © (06.11.08 16:30) [51]
    Другие (кроме вставки) модификации таблицы, к которой ты выполняешь запрос, осуществляются ?
    Подозрения на попадание твоей транзакции на сборку мусора пока еще не сняты ..
  • Tepex © (06.11.08 16:54) [52]
    [51] Да вот я только что проанализировал свою базу при помощи утилиты IBAnalyst и она показала что плохо проиндексирована база данных и много мусора. Скорее всего ваши подозрения верны(про мусор). Потому что приложение написанное на Делфи так же при работе с базой данных тормозит.  В базу данных fb ничего не вставляется только читается.
  • Сергей М. © (06.11.08 17:08) [53]

    > она показала что плохо проиндексирована база


    Что значит "плохо" ?
    Подробней..
    Конкретно про все имеющиеся индексы, касающиеся поля orders.agreementno ..


    > много мусора


    > В базу данных fb ничего не вставляется


    Откуда же там взялись данные, если ничего не вставляется ?

    И откуда взялся мусор, если кроме вставок никаки модификации не осуществляются (да и модифицировать-то собственно нечего, раз ничего не вставляется) ?

    Речь идет об операциях с базой со стороны каждого из клиентов, а не только клиента в контексте твоего 1С-приложения !
  • Сергей М. © (06.11.08 17:20) [54]
  • Tepex © (06.11.08 17:25) [55]

    > Речь идет об операциях с базой со стороны каждого из клиентов,
    >  а не только клиента в контексте твоего 1С-приложения !

    Ну так бы и сразу. Дело в том как я писал раннее я не могу знать при помощи каких механизмов происходит вставка данных в базу потому что они вставляются при помощи приложения написанного на Делфи, а исходников нет у меня.
    > > В базу данных fb ничего не вставляется
    >
    >
    > Откуда же там взялись данные, если ничего не вставляется
    > ?

    я имел ввиду что со стороны 1С ничего не вставляется.
    > > она показала что плохо проиндексирована база
    >
    >
    > Что значит "плохо" ?
    > Подробней..
    > Конкретно про все имеющиеся индексы, касающиеся поля orders.
    > agreementno ..


    Плохих индексов: 40.
    Под `плохими` мы имеем в виду индексы с большим числом повторяющихся
    ключей (90% от всех ключей) и большими группами одинаковых ключей
    (30% от всех ключей). Большие группы одинаковых ключей замедляют
    сборку мусора - MaxEquals здесь это % самой большой группы ключей с
    одинаковыми значениями. Поиск по таким индексам является
    неэффективным. Вы можете удалить такие индексы (если это не индекс по
    Foreign Key).

    Некоторые транзакции активны слишком долгое время. Самая старая
    транзакция Oldest active стартовала 9060 транзакций назад, в то время
    как среднее число транзакций в день примерно равно 13370.
    Это может быть сигналом, что имеет смысл проверить текущую схему
    обработки транзакций в ваших приложениях. Убедитесь, что транзакции
    завершаются commit/rollback после использования, и не находятся в
    активном состоянии долгое время без необходимости. Не стартуйте много
    ненужных транзакций. Также имеет смысл посмотреть на динамику
    количества транзакций в зависимости от активности клиентских
    приложений. Одной из причин большого числа активных транзакций может
    быть потеря transacton handle в коде приложения. То есть, приложение
    стартует транзакцию, но не завершает ее по commit/rollback.
    Другой причиной может быть использование BDE при отсутствии явного
    управления транзакциями, и параметр алиаса SQLPASSTHROUGH = SHARED
    NOAUTOCOMMIT.

    Текущий размер страницы базы данных = 4096 байт.

    Бесполезных индексов: 16.
    Бесполезные индексы имеют только одно значение ключа. То есть,
    столбец, по которому создан индекс, содержит одно единственное
    значение во всех строках таблицы. Поэтому, использование индекса в
    таких случаях приводит только к лишнему чтению страниц индекса с
    диска. Вы можете удалить такие индексы (если это не индекс по Foreign
    Key).

    Ну вообщем вот такие вот рекомендации да IBAnalyst
  • Tepex © (06.11.08 17:28) [56]
    [54] Спасибо! Но я уже это прочитал завтра буду экспериментировать.
 
Конференция "Базы" » приложение зависает при обращении к Firebird. что делать помогите [D7, IB6.x]
Есть новые Нет новых   [134477   +39][b:0][p:0.003]