|
БД, она тормозит с обновлением что ли...
|
|||
---|---|---|---|
#18+
Вот, заменил вроде кусок проги, что могу тестировать хоть что-то... Действие: модуль следящий за процессами 1А) Меняет строку в таблице БД Код: plaintext 1.
============================ модуль UserInterface с Listview 1Б) по таймеру(Interval=1000) ловит файл, сгенерированный в п.2А (выше) и обновляет строчку в ListView Все корректно... Но дальше: в UserInterface есть кнопка "Обновить". Смысл: вся информация в ListView (700 строк в моем тесте) считывается из вышеупомянутой таблицы Table Сразу после обновления одной строчки(1Б) жмем этот обновить и видим что Строка заменилась СТАРЫМИ данными. Нет, с какого-то раза НОВЫЕ данные появляются, но это может быть через несколько секунд. Т.е. вывод какой: команда 1А выполняется СЛИШКОМ ДОЛГО. Когда вместо Table была текстовуха, ничего подобного не было. А я еще планирую пункты 2А и1Б заменить на 2АА) генерирует строчку в БД с указателем на строку обновленную в п.1А ============== 1ББ) по таймеру читает 2АА) из БД и заполняет одну(или несколько) строчку ListView из основной таблицы Table. А если там еще будет старое значение. И вообще, эти тормоза это не дело. М.б. подход неправильный? А какой правильный? Текстовухи оставить и не лезть в эти БД? Процессы кот. отслеживаются достаточно динамичные и задержки с отображением в несколько секунд мне не нужны... ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2011, 16:05 |
|
БД, она тормозит с обновлением что ли...
|
|||
---|---|---|---|
#18+
Ээээ...все гораздо хуже. Это не СЛИШКОМ ДОЛГО, это ж, это потеря данных, это НЕНАДЕЖНО. Действие: модуль следящий за процессами 1) Добавляет строку в Table через INSERT INTO на следующем шаге через короткое время (информация по данному процессу изменилась): 2) Запрашивает по какому-то критерию эту же строку через SELECT ...WHERE и если она есть (RS.EOF=false) то 3) Делает ей обновление через UPDATE. Так вот засада в том, что на запрос в п.2 БД отвечает ("дарагой, да нет такой строки" RS.EOF=true), очевидно не успев обновиться согласно п.(1) Это не тормоза, это Ж, это гнилая технология. Это даже уже не знаю что делать... Это не на 700 строчках, это на одной строчке глючит. Идеи есть, кроме как послать все эти ADODB и БД в еБД? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2011, 18:04 |
|
БД, она тормозит с обновлением что ли...
|
|||
---|---|---|---|
#18+
Тэкс. Что-то ты не то наворотил, все должно работать нормально, без задержек. Вопрос для начала такой, а ты часом не используешь ДВА РАЗНЫХ коннекшна к одной базе? Если так - переделай на один. Если один - показывай фрагменты кода. ЗЫ: Или это вообще две разных программы? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2011, 19:05 |
|
БД, она тормозит с обновлением что ли...
|
|||
---|---|---|---|
#18+
Дмитрий771) Добавляет строку в Table через INSERT INTO на следующем шаге через короткое время (информация по данному процессу изменилась): 2) Запрашивает по какому-то критерию эту же строку через SELECT ...WHERE ... Так вот засада в том, что на запрос в п.2 БД отвечает ("дарагой, да нет такой строки" RS.EOF=true) В одном коннекшне запросы стопудово работают синхронно (если только ты не запускаешь асинхронно умышленно), поэтому такой ситуации просто не может быть ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2011, 19:22 |
|
БД, она тормозит с обновлением что ли...
|
|||
---|---|---|---|
#18+
Shocker.ProЗЫ: Или это вообще две разных программы? Естественно. 1) модуль следящий за процессами 2) модуль UserInterface с Listview Это как минимум. Могут быть еще другие "клиенты", но эти 2 основные. Поэтому естественно Shocker.Proиспользуешь ДВА РАЗНЫХ коннекшна к одной базе Причем указанные 2 модуля должны держать коннекты непрерывно. Переделать в один не могу, нарочно разделял. Тот который "следящий за процессами" может быть "сервисом NT under local system account". Тот который "UserInterface с Listview", может быть вообще не запущен, прога все равно будет делать "дела". Можно конечно "отключаться/подключаться", но сам понимаешь... И потом это будет очень хаотический коннект/дисконнект. Приложение достаточно динамическое. Глобальные цели: 1) Улучшение "динамики", особенно при большом количестве строк и (или) одновременных процессов. 2) Легкость в добавлении новых ф-ций: поле напр. в БД проще добавить, чем переписать обработку текстовух. 3) Одновременный безпроблемный доступ к одной и той же "таблице". ("следящий за процессами" может добавить/редактировать строчку, User может строчку "редактировать"/удалить). Если я сейчас добавлю "обновление ListView через БД" с долблением БД по таймеру то при таком раскладе вообще все встанет. Т.е. операция Execute выполняется "несколько секунд", что неприемлимо. С таблицей-текстовухой: прочитал, нашел, поменял, сохранил- таких проблем не было. И переклиниваний из-за одновременного доступа к одной и той же текстовухе тоже не заметил, хотя логично предположить что это потенциальная проблема "текстовой" версии. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2011, 19:30 |
|
БД, она тормозит с обновлением что ли...
|
|||
---|---|---|---|
#18+
Ну я конечно понимаю что WHERE field LIKE '%" & somevalue & "%'" м.б. не лучший вариант (извесно кстати что строчка только одна, ее и надо получить) лучше наверно (по возможности! не всегда возможно!) WHERE field='value' но не похоже что глобальная проблема в этом. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2011, 19:37 |
|
БД, она тормозит с обновлением что ли...
|
|||
---|---|---|---|
#18+
Дмитрий77Т.е. операция Execute выполняется "несколько секунд", что неприемлимо. Так сколько выполняется Execute - имеется ввиду, что синхронная операция выполняется несколько секунд? (то есть в пределах одного приложения, другого пока не рассматриваем) Дмитрий77Ну я конечно понимаю что WHERE field LIKE '%" & somevalue & "%'" м.б. не лучший вариант (извесно кстати что строчка только одна, ее и надо получить) Отвратительный вариант. Если знаешь ключ строки - работать надо с ним. Засунь его в тэг листвью. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2011, 19:49 |
|
БД, она тормозит с обновлением что ли...
|
|||
---|---|---|---|
#18+
Shocker.ProДмитрий77Т.е. операция Execute выполняется "несколько секунд", что неприемлимо. Так сколько выполняется Execute - имеется ввиду, что синхронная операция выполняется несколько секунд? (то есть в пределах одного приложения, другого пока не рассматриваем). И как я это посчитаю? И зачем? Я и так вижу что несколько секунд. Посмотри в начало топика. 1A дает команду базе потом 1Б дает команду Listview "небазовым методом" (т.е. с т.зр. приложения команда 1A прошла) никаких доп.ключей в Execute я не использую. в ListView строчка обновилась потом я через Refresh читаю базу (таблицу) целиком и по виду той самой строчки понимаю что база команду 1A ни фига не выполнила и только после раза 5-го из базы скачивается "обновленная" информация Shocker.ProДмитрий77Ну я конечно понимаю что WHERE field LIKE '%" & somevalue & "%'" м.б. не лучший вариант (извесно кстати что строчка только одна, ее и надо получить) Отвратительный вариант. Если знаешь ключ строки - работать надо с ним. Засунь его в тэг листвью. Тэг я кажется для сортировки дат использую. Ну а при чем тут ListView. Такие "умные запросы" не UserInterface, а "модуль следящий за процессами" посылает, ему про ListView вообще ничего не известно. Критерием для поиска строчки является значение одного из полей (в нек. случаях часть поля), кот. не повторяется по логике программы. Не кажется ли Вам, что вся эта кухня тухлятинкой попахивает? Ну, потерял несколько дней, бывает. А то ведь и вправду через год волосы на себе рвать буду... ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2011, 20:55 |
|
БД, она тормозит с обновлением что ли...
|
|||
---|---|---|---|
#18+
Shocker.Pro, зачем в тег, у листвью есть свой кей. ТС , что за СУБД ? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2011, 20:57 |
|
БД, она тормозит с обновлением что ли...
|
|||
---|---|---|---|
#18+
big-duke, База mdb. Тестовый экземпляр создан в Access-2000. Предполагается создавать программно. Но если так дальше пойдет, то до этого боюсь не дойдет. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2011, 21:46 |
|
БД, она тормозит с обновлением что ли...
|
|||
---|---|---|---|
#18+
И как я это посчитаю? Код: plaintext 1. 2.
Поэтому естественноНеестественно. Модуль, следящий за процессами, можно сделать в виде ActiveX exe, подключаться к нему через GetObject, просить соединение. А лучше не просить и вообще избавиться от таймера и дурацкого файла - надзиратель должен генерировать события с данными для интерфейса. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2011, 23:25 |
|
БД, она тормозит с обновлением что ли...
|
|||
---|---|---|---|
#18+
Дмитрий77И как я это посчитаю? И зачем? Я и так вижу что несколько секунд. Посмотри в начало топика. 1A дает команду базе потом 1Б дает команду Listview "небазовым методом" (т.е. с т.зр. приложения команда 1A прошла) Так еще, раз, ты меня не понял. Сколько времени выполняется конкретно команда Execute? (видимость обновленных данных в другом приложении пока не рассматриваем). Если несколько секунд - факт, что ты делаешь что-то неправильно. Дмитрий77Ну а при чем тут ListView. Такие "умные запросы" не UserInterface, а "модуль следящий за процессами" посылает, ему про ListView вообще ничего не известно. Данные надо обновлять по ключу, а не по Like. Тот, кто посылает команду Update, должен знать ключ строки, для того он и предназначен. Иначе ты навешиваешь блокировку по транзакции на всю, блин, таблицу, пока идет сканирование по Like, естественно, другие процессы начинают тормозить. Дмитрий77Не кажется ли Вам, что вся эта кухня тухлятинкой попахивает? Ну, потерял несколько дней, бывает. А то ведь и вправду через год волосы на себе рвать буду... Если считаешь, что проще и быстрее ездить на велосипеде, потому что не смог разобраться с педалью сцепления в автомобиле - твое право. И даже достоинства у велосипеда есть неоспоримые. Но, скажем, смотраться на выходные на дачу проще все же на авто. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2011, 23:52 |
|
БД, она тормозит с обновлением что ли...
|
|||
---|---|---|---|
#18+
AntonariyИ как я это посчитаю? Код: plaintext 1. 2.
Ты не понял суть "задницы". Вот типичный кусок кода надсмотрщика: Код: plaintext 1. 2. 3.
Файл name.ext (в нем находится одна строчка str, которая дублирует ту строчку в Table, что я посылаю в БД командой Update) Этот файл считывается таймером приложения, где ListView и обновляется одна строчка в ListView. И обновление этой строчки в ListView происходит быстро (из текстовухи, которая генерируется уже после Update) Посему понятно что debug.print DateDiff ничего плохого не покажет. А вот после того как строчка ListView обновилась (из текстовухи,которая генерируется уже после Update) Я в приложении где ListView жму кнопку "перегрузи весь ListView из базы", и весь ListView запрашивается из базы. И в том числе та строчка. И с ней все остальные И эта строчка оказывается со старыми данными (тем которое были до Update). Теперь понятно объянил? AntonariyЕще было бы интересно узнать, сколько записей в таблице, что так нещадно апдейтится.] Пробовал 700 строчек, пробовал 1 строчку. Результат примерно одинаков. Update давно отработал, а информация в базе не обновилась. А маразм доходит до того, что если из надсмотрщика делать код: Код: plaintext 1. 2. 3. 4.
то этот update не срабатывает, т.к. "та строчка что добавлена в (1)" еще не оприходовалась базой на момент когда ее надо уже править. т.е. я понимаю что 2-3сек не критично для секретарши которая ковыряет в носу, забивая при этом И-МЯ....ФА-МИ-ли---ЯЯЯЯЯ воз-расст <АББ-НАВИТЬ> но м.б. просто данная технология не для данной задачи? Честно, слышал что люди имеют проблемы при работе с БД, но не ожидал что это такое Г. Мою реализацию конечно можешь обсмеять, сказать много умного про ActiveX, SQL-сервер и т.п. Но проблема то не в этом. А проблема в том, что время "реальности/доступности" обновленных данных измеряется се-кун-дами, а это неприемлимо. Вот я счас потратил несколько дней чтобы имплементировать БД-access (частично, но можно тестировать). Это при том что я это хоть немного знаю. А прикинь я счас месяц потрачу на изучение каких-то новых "технологий" и будет такая же Ж. М.б. лучше направить усилия на оптимизацию моих "текстовых БД"? Shocker.ProТак еще, раз, ты меня не понял. Сколько времени выполняется конкретно команда Execute? (видимость обновленных данных в другом приложении пока не рассматриваем). Очень недолго выполняется, см.выше., или это непонятно из приведенного кода. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2011, 00:34 |
|
БД, она тормозит с обновлением что ли...
|
|||
---|---|---|---|
#18+
Дмитрий77А маразм доходит до того, что если из надсмотрщика делать код: Код: plaintext 1. 2. 3. 4.
то этот update не срабатывает, т.к. "та строчка что добавлена в (1)" еще не оприходовалась базой на момент когда ее надо уже править. Нет, при едином коннекте такого гарантированно вообще не может быть. Обновив данные ты тут же получишь обновленные, а не старые. Так что просто ты что-то не так делаешь, но я никак не могу понять из приведенных фрагментов - что именно. Можешь вычленить в чистый проект только этот код и выложить его вместе с тестовой таблицей БД? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2011, 00:43 |
|
БД, она тормозит с обновлением что ли...
|
|||
---|---|---|---|
#18+
Shocker.Pro, легко сказать "вычлени в чистый проект". В надсмотрщике я даже Debug.Print и /verbose применить легко не могу ибо он запускается из-под другого приложения и читает данные других модулей. Я добавил этот "дебаг" в лоб, раз уж просили посчитать (придется удалять потом) -сарказмов и лекций просьба не надо. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
Время самого паршивого execute составило 3 милли секунды, что приемлимо; до/после идут парами. Но при этом из БД считываются старые данные еще несколько секунд после... >Нет, при едином коннекте такого гарантированно вообще не может быть. Возможно, что-то напутал и вы правы. С этим думаю смогу разобраться. Но вот с задержкой обновления, когда считываешь эту таблицу факт есть факт. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2011, 01:14 |
|
БД, она тормозит с обновлением что ли...
|
|||
---|---|---|---|
#18+
Дмитрий77>Нет, при едином коннекте такого гарантированно вообще не может быть. Возможно, что-то напутал и вы правы. С этим думаю смогу разобраться. Но вот с задержкой обновления, когда считываешь эту таблицу факт есть факт. Честно говоря, и это несколько странно. Тогда тем более хотелось бы оба проекта в "очищенном" виде "для опытов" (с) ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2011, 01:27 |
|
БД, она тормозит с обновлением что ли...
|
|||
---|---|---|---|
#18+
Shocker.Pro, Код: plaintext 1. 2. 3. 4.
Сейчас чуть добавил дебага. IF RS.EOF=false срабатывает корректно, но почему-то иногда может не сработать adoConn.Execute (UPDATE table SET... WHERE та строчка что добавлена в (1) т.е. может сработать, а может не сработать. При этом к строке апдейта я придраться не сумел. >Тогда тем более хотелось бы оба проекта в "очищенном" виде "для опытов" (с) Не смешите меня, я этими опытами уже 2 года занимаюсь. Это не будет работать в отрыве от всего приложения. Данные на вход "надсмотрщика" поступают из C++ плагина, кот. работает из под C++ приложения, кот. держится на нескольких dll и т.п. >Честно говоря, и это несколько странно. а что странного? Скорее всего глобальная проблема в следующем. Каждое Connection работает со своей "локальной копией" таблицы, базы и всей дребедени что с этим связано. Естественно по каким-то (медленным) законам идет обмен с "базой", но это действительно секунды, а не миллисекунды. Другой Connection работает со своей "локальной копией", которой про первую "копию" ничего не известно. Для обычной офисной базы этого более чем достаточно. Для динамической задачи этого не достаточно. Как вариант можно попробовать закрывать Connection (а не только рекордсет) после каждой операции, а потом открывать по новой. Можно попробовать отказаться от Execute и открывать рекордсеты "по-полной" Попробую завтра поиграться (применительно к тому "участку" проги что сделал). Но непонятно выдержит ли сама база и ADODB такой долбеж, а он и так не хилый. и главное будет ли это НАДЕЖНЫМ решением. Во времени я скорее всего сильно не проиграю. Т.е. на данном этапе надо довыяснить приемлимость модели, пока ответ "НЕТ". Текстовые файлы выдерживают. Что касается конструкций like %%, ну лучше конечно=, но это думаю "в рамках". По "ключу" вряд ли удастся. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2011, 02:19 |
|
БД, она тормозит с обновлением что ли...
|
|||
---|---|---|---|
#18+
Дмитрий77Как вариант можно попробовать закрывать Connection (а не только рекордсет) после каждой операции, а потом открывать по новой. Ага, так и есть. Если так делать, то все синхронно. Но при этом время на считывание 700 строк возрастает на 50% (+70мс на мощном компьютере), это дольше чем прочитать текстовуху. И еще непонятно, сколько мы теряем на "обработку одной записи", и не возникнет ли ситуации, что поток входящих данных за единицу времени превысит "максимальную пропускную способность" для обработчика. Т.е. если есть 50 процессов, и за секунду поступило 50 файлов, надо за эту секунду переконнектиться с базой 50 раз. Если на один реконнект тратится пусть 50мс, то 50Х50=2500мс=2,5сек. Как-то неправильно. Можно конечно делать реконнект по таймеру раз в сек (как я и делаю с данными). Connect>переработка данных> дисконнект. Остается еще понять, при дисконнекте база сразу ли проапгрейдится... ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2011, 03:17 |
|
БД, она тормозит с обновлением что ли...
|
|||
---|---|---|---|
#18+
Дмитрий77, поддержка Майкрософт о Вашей проблеме ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2011, 04:02 |
|
БД, она тормозит с обновлением что ли...
|
|||
---|---|---|---|
#18+
Дмитрий77а что странного? Скорее всего глобальная проблема в следующем. Каждое Connection работает со своей "локальной копией" таблицы, базы и всей дребедени что с этим связано. Коннекшн не работает с таблицей вообще - это прерогатива рекордсета, а его-то как раз ты открываешь заново, поэтому он не может его кешировать. Несколько секунд - на мой взгляд очень много, не должно быть такого. Поэтому я просил очищенный тестовый вариант - чтобы можно было бы поиграть с параметрами соединения и самими запросами. Пока основное подозрение на like - из-за того, что он каждый раз при обновлении он сканирует (а может и блокирует) всю таблицу, возможно долго идет фиксация транзакции. Но это все надо пробовать руками на живом примере - теоретизирование результатов не даст. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2011, 10:34 |
|
БД, она тормозит с обновлением что ли...
|
|||
---|---|---|---|
#18+
пробуй камнемДмитрий77, поддержка Майкрософт о Вашей проблеме The writer must start a transaction, using ADO's Connection.BeginTrans, prior to writing the data. The writer must make the database updates and then commit the transaction (using ADO's Connection.CommitTrans). The reader must call JRO.JetEngine.RefreshCache passing in it's connection prior to attempting to read the data. ну на первый взгляд - по делу ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2011, 10:38 |
|
БД, она тормозит с обновлением что ли...
|
|||
---|---|---|---|
#18+
Shocker.ProДмитрий77а что странного? Скорее всего глобальная проблема в следующем. Каждое Connection работает со своей "локальной копией" таблицы, базы и всей дребедени что с этим связано. Коннекшн не работает с таблицей вообще - это прерогатива рекордсета, а его-то как раз ты открываешь заново, поэтому он не может его кешировать.. Это все игра слов, анатомия и т.п. (вскрытие трупов и изучение "всей дребедени" не является целью) а суть я похоже угадал, и слава богу что хоть так. А пробуй камнем подсказал как правильно, за что ему наверно заранее спасибо, и думаю так и надо. Сейчас времени нет, а вечером обязательно попробую и отчитаюсь. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2011, 11:33 |
|
БД, она тормозит с обновлением что ли...
|
|||
---|---|---|---|
#18+
Shocker.ProПока основное подозрение на like - из-за того, что он каждый раз при обновлении он сканирует (а может и блокирует) всю таблицу, возможно долго идет фиксация транзакции. Но это все надо пробовать руками на живом примере - теоретизирование результатов не даст. C Like я согласен что лучше по возможности надо менять на ='value'(не всегда возможно, но в большинстве случаев у меня возможно, это из-за лени вычислить точное значение их налепил), я уже убрал вчера кроме одного-двух мест, но "живой пример" показывает что это особых выигрышей на таблице в 1000 строк не дает и несоизмеримо с описанной выше проблемой, по сути которой пока все сказано выше. По хорошему еще надо добавить в запрос: 1) ищи только первое значение (наф. перелопачивать все, если уже нашли чего искали) 2) ищи его начиная с последних записей (sorted by key который incremented по убыванию, но не уверен что это sorted само по себе не добавит тормозов, одно дело всю таблицу в listview выводить, а другое дело просто короткий запрос) Если здесь подскажете, воспользуюсь. Почему с последних записей. Потому что нижняя часть записей это фактически статический архив процессов (м.б. потом имеет смысл перенести в отдельную таблицу, сейчас не хочу , надо тогда чуть менять структуру проги, это не будет проблемой сделать потом при желании, здесь мне извините видней). Поясню: например в почтовой программе есть письма "готовые к отправке", "отправля емые " (в тек. момент) и "отправ ленные " (архив). Shocker.ProПоэтому я просил очищенный тестовый вариант - чтобы можно было бы поиграть с параметрами соединения и самими запросами. Это примерно эквивалентно тому, что заново все написать. Я уже написал что это нереально при всем уважении к Вам и вашему желанию помочь. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2011, 13:03 |
|
БД, она тормозит с обновлением что ли...
|
|||
---|---|---|---|
#18+
Дмитрий77По хорошему еще надо добавить в запрос: 1) ищи только первое значение (наф. перелопачивать все, если уже нашли чего искали) 2) ищи его начиная с последних записей (sorted by key который incremented по убыванию, но не уверен что это sorted само по себе не добавит тормозов, одно дело всю таблицу в listview выводить, а другое дело просто короткий запрос) Код: plaintext
Поле, по которому идет сортировка, надо индексировать (можно даже сделать убывающий индекс, не знаю, повлияет ли это существенно на производительность), тогда в сочетании с TOP 1 запрос будет выполняться достаточно быстро Дмитрий77Поясню: например в почтовой программе есть письма "готовые к отправке", "отправля емые " (в тек. момент) и "отправ ленные " (архив). Надо просто ввести соответствующее поле с признаком и в WHERE дополнительно отбирать по этому признаку. Дмитрий77Shocker.ProПоэтому я просил очищенный тестовый вариант - чтобы можно было бы поиграть с параметрами соединения и самими запросами. Это примерно эквивалентно тому, что заново все написать. Я уже написал что это нереально при всем уважении к Вам и вашему желанию помочь. Ну это отладка методом последовательного приближения. Вот тут 7886988 подобную работу пришлось проделать, но она того стоила, ибо баг был побежден. Получается либо уполовинивать свой проект, проверять баг, если есть уполовинивать дальше и т.п. Либо наоборот создать чистый проект только с существенными функциями (в нашем случае это два проекта, один с инсертом, другой с селектом по таймеру) и смотреть, есть ли баг. Тут тебе виднее. Впрочем, надо сначала попробовать совет от микрософта. Однако, если даже если он поможет, это не отменяет оптимизации работы с БД. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2011, 13:50 |
|
БД, она тормозит с обновлением что ли...
|
|||
---|---|---|---|
#18+
Shocker.ProВпрочем, надо сначала попробовать совет от микрософта. Да, проверил. Все путем. Основная проблема с задержкой обмена в несколько секунд решается. Но это было ясно без кодов и без проверки после того как. 1. Я предположил что re-connect спасет, и это подтвердилось проверкой. Хотя понятно что долбеж connect-disconnect не есть гуд. 2. Пробуй камнем ткнул в правильное решение проблемы. Спасибо ему еще раз. Единственное. Конструкция (обновиться перед чтением): Код: plaintext 1. 2.
Microsoft Jet and Replication Objects 2.6 Library (msjro.dll) Ответа по поводу какую версию ADO подключать я так и не получил (вы упомянули про 2.8 и типа усе есть, но я бы не форсировал...из осторожности), поэтому считаю логичным, если уж добавлять refrerencы то вот эту пару Код: plaintext 1.
Или все-таки CreateObject? Вот все беспокоюся...Меня честно это сторона вопроса беспокоит гораздо больше чем Like %%. Т.е. предпочту ездить на велосипеде чем разбиться на недоделанном ЛА. P.S. При наличии парашюта и навыков по применению оного можно и по крайнему варианту. Но есть проблема: не все пользователи - парашютисты. По поводу лайков и прочего. Ну это на самом деле рихтовка по сравнению с задержками на секунды. Тем не менее не буду злоупотреблять советами. Shocker.ProПоле, по которому идет сортировка, надо индексировать . бог с ним, сделал: Код: plaintext 1. 2. 3. 4.
Shocker.ProОднако в SELECTe можно получить ключевое поле и использовать его в UPDATE. Это лучше, чем Like в Update... в сочетании с TOP 1.... В большинстве ф-ций применил конструкцию: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Однако идеализировать не надо, есть исключения: 1. В одном месте я все таки применяю LIKE (констукция field имеет вид "СЛОВО(StrValue)", где СЛОВО - могут быть разные): Код: plaintext 1. 2.
не всегда оно есть. Строчка может обновляться целиком (т.е. все новые значения полей содержатся в свежепоступивших данных). Тогда первый запрос с SELECT отсутствует, т.е. тогда Код: plaintext 1. 2.
Но это повторюсь рихтовка. Чтобы оценить динамику, надо все доделать, тогда смогу запустить краш-тесты (скажем по 50 одновременных процессов с разрастанием таблицы до нескольких тысяч записей). Вот тогда и посмотрим, как эти 50 строк будут "одновременно" обновляться при скажем 10000 записей в таблице (реально обычно 1-3 процесса и 10-100 записей, но динамично-массовые исключения должны быть предусмотрены и также реально могут иметь место быть на отдельных пусть редких user-системах). Понятно что без решения первой проблемы ни о какой динамике говорить вообще нельзя, но она тьфу-тьфу решилась. Shocker.ProНу это отладка методом последовательного приближения.. Ну а как ты хотел. Запускается через Shell из под другой проги, в Debuggeре не посмотришь, в отрыве от контекста не проверишь, /verbose особо не вставишь, надо дописывать строки, потом удалять или комментировать, но такие комментарии в большом кол-ве это "мусор" в коде. Добавь сюда до кучи еще протектор, без обработки которым некот. модули вообще работать не будут. Shocker.Proв нашем случае это два проекта, один с инсертом, другой с селектом по таймеру.. Не упрощайте, и того и другого и третьего в обоих хватает.... У меня там не 2 проекта а два десятка модулей, если не больше. Хотя согласен, не все лезут в БД с целью ее изрикошетить, таких не много. Эти 2 -основные. Shocker.ProТут тебе виднее... Ясно дело...Но какую-то часть осилил. Можно двигаться дальше. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2011, 02:50 |
|
|
start [/forum/topic.php?fid=60&msg=37078327&tid=2156739]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
53ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
others: | 278ms |
total: | 432ms |
0 / 0 |