|
|
|
BDE Client and deadlocks???
|
|||
|---|---|---|---|
|
#18+
Вообщем есть следущая проблема: Написан BDE клиент, работает все нормально, когда он работает один, а если еще парочку клиентов запустить, то капец deadlock-и достают. Мое видение проблемы: Дело в том что используется компонент TQuery которые просто используются для отображения таблиц, все операции выполняются с помощью хранимых процедур, и врядли возникают deadlock-и там, дело в том что есть основание полагать что TQuery использует курсор на сервере, причем курсор видимо read only, который блокирует записи и не дает выполнятся хранимым процедурам, а почему я так решил что он использует курсор на сервере, то потому что при движении по таблице он каждый раз дергает сервер для зачитки даных. Когда то я использовал ADO там можно указывать тип курсора клиентский или серверный, и когда указываешь клиентский все работает класно, а серверный это аналог работы TQuery притармаживает по понятным причинам... Внимание вопрос: Можна ли в TQuery установить клиентский курсор, если да то как, или другие предложения которые позволят развязать конфликт BDE Client-ов... Жду ваши предложения... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2002, 10:07:53 |
|
||
|
BDE Client and deadlocks???
|
|||
|---|---|---|---|
|
#18+
для отображения данных можно использовать не TQuery, а как у меня, например, TStoredProcedure, это должно помочь. у меня тоже все через БДЕ, порядка 20-30 юзверей + удаленный доступ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2002, 10:40:12 |
|
||
|
BDE Client and deadlocks???
|
|||
|---|---|---|---|
|
#18+
Подробнее пожалуйста... А как через Stored Procs??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2002, 10:48:34 |
|
||
|
BDE Client and deadlocks???
|
|||
|---|---|---|---|
|
#18+
Привет насколько я понял разговор идет о Delphi or Cbuilder Там же где и TQuery находиться и TStoredProc... Просто перетащи его на DataModule и юзай на здоровье ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2002, 10:56:13 |
|
||
|
BDE Client and deadlocks???
|
|||
|---|---|---|---|
|
#18+
Это я знаю, меня интересует как отображать данные через Stored Procs, как это делает TQuery через DataSource когда его цепляешь к Grid-у ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2002, 11:01:59 |
|
||
|
BDE Client and deadlocks???
|
|||
|---|---|---|---|
|
#18+
на серваке создаешь хранимую процедуру что-то типа Код: plaintext 1. 2. связываешь TStoredProcedure c хранимой процедурой, описываешь параметры, делаешь Open ( не Exec ! ) на выходе получишь TDataSet далее TDataSource, TDBGrid ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2002, 11:34:37 |
|
||
|
BDE Client and deadlocks???
|
|||
|---|---|---|---|
|
#18+
А если нужно отображать связанные таблицы??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2002, 18:10:04 |
|
||
|
BDE Client and deadlocks???
|
|||
|---|---|---|---|
|
#18+
делай запрос, который связывает эти таблицы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2002, 18:25:18 |
|
||
|
BDE Client and deadlocks???
|
|||
|---|---|---|---|
|
#18+
Че-то глючит пишет: ... raised exception class EDBEngineError with message General SQL error ct_send(): user api layer: external error: this routine cannot be called because another command structure has results pending. Process stopped .... Вообщем это вызов еще одной процедуры которая имеет параметры из основной таблицы и по идее должна возвращать подчиненную таблицу которая отвечает параметрам... Наверно уже перетрудился... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2002, 18:50:55 |
|
||
|
BDE Client and deadlocks???
|
|||
|---|---|---|---|
|
#18+
нельзя внутри процедуры, кот. возвращает набор данных вызывать другую процедуру, кот. возвращает набор данных ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2002, 19:03:30 |
|
||
|
BDE Client and deadlocks???
|
|||
|---|---|---|---|
|
#18+
Да нет же вложенного вызова там нету... Схема работы такая: 1. Вызывается хранимая процедура, которая вовращает главную таблицу 2. Есть DBEdit который привязан к Grid-у в котором отображается главная таблица 3. Потом DBEdit->Text передается как параметр в следущую хранимую процедуру, которая возвращает подчиненную таблицу в другой Grid в соответствии с параметром 4. Error при открытии второй хранимой процедуры ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2002, 19:14:24 |
|
||
|
BDE Client and deadlocks???
|
|||
|---|---|---|---|
|
#18+
??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2002, 10:24:31 |
|
||
|
BDE Client and deadlocks???
|
|||
|---|---|---|---|
|
#18+
Мне кажется нельзя использовать TDBEdit в этом случае ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2002, 10:31:09 |
|
||
|
BDE Client and deadlocks???
|
|||
|---|---|---|---|
|
#18+
> ct_send(): user api layer: external error: this routine cannot be called because another command structure has results pending. Process stopped Эта проблема из-за нарушения "золотого правила" при работе с TQuery и TStoredProc. Заключается оно в следующем - после метода Open строчкой ниже должен быть метод FetchAll. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2002, 10:36:01 |
|
||
|
BDE Client and deadlocks???
|
|||
|---|---|---|---|
|
#18+
2 Dankov в нашем огромном приложении, соержащем не один десяток форм и с которым работают множество пользователей нет ни одного FetchAll ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2002, 10:39:31 |
|
||
|
BDE Client and deadlocks???
|
|||
|---|---|---|---|
|
#18+
Он используется как параметр второй хранимой процедуры, а не для редактирования Просто когда юзер двигается по главному гриду, я через DBEdit знаю на какой он строке стоит, чтобы выбрать с помощью другой хранимки выбрать записи которые подчинены записи из главной таблицы , таким образом должно быть отображение 1->n. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2002, 10:40:05 |
|
||
|
BDE Client and deadlocks???
|
|||
|---|---|---|---|
|
#18+
И смысл этого FetchAll-а??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2002, 10:45:31 |
|
||
|
BDE Client and deadlocks???
|
|||
|---|---|---|---|
|
#18+
Читаю справку... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2002, 10:49:54 |
|
||
|
BDE Client and deadlocks???
|
|||
|---|---|---|---|
|
#18+
Для этого не обязательно использовать TDBEdit, можно обойтись средствами ТDBGrid ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2002, 10:50:07 |
|
||
|
BDE Client and deadlocks???
|
|||
|---|---|---|---|
|
#18+
> в нашем огромном приложении, соержащем не один десяток форм и с которым работают множество пользователей нет ни одного FetchAll У вас, значит, стоит свежий BDE версии не ниже 5.01 (вроде, точно не помню, с какой версии это ввели), который автоматически делает FetchAll для недофетченного набора как только по тому же соединению запрашивается новый набор данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2002, 11:00:54 |
|
||
|
BDE Client and deadlocks???
|
|||
|---|---|---|---|
|
#18+
да нет, вроде 4.0 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2002, 11:12:34 |
|
||
|
BDE Client and deadlocks???
|
|||
|---|---|---|---|
|
#18+
Отсутствие граблей в частном случае не говорит о том, что их не бывает вообще. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2002, 11:19:03 |
|
||
|
BDE Client and deadlocks???
|
|||
|---|---|---|---|
|
#18+
Не знаю че там за лажа, но FetchAll() помог избежать ошибку BDE Error, а насчет множества пользователей еще не знаю.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2002, 11:21:00 |
|
||
|
BDE Client and deadlocks???
|
|||
|---|---|---|---|
|
#18+
отсутствие граблей в течение длительного срока кое о чем говорит ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2002, 11:21:02 |
|
||
|
BDE Client and deadlocks???
|
|||
|---|---|---|---|
|
#18+
> отсутствие граблей в течение длительного срока кое о чем говорит Вполне может быть, что у вас такая стратегия программирования, при которой указанные грабли не возникают. Для наступания на грабли нужны соотв. условия. Могу привести примеры, когда вышеуказанные грабли не возникнут и без FetchAll: 1) sql-сервер - не MSSQL и не SYBASE 2) выборки не большие в большинстве своем (до 1000 записей) 3) после Open идет переход на последнюю запись или близко к ней. 4) после Open происходит построчная обработка записей 5) написан наследник от TQuery, в котором переопределены некоторые методы (типа IsSequenced, чтобы ползунок в гриде нормально работал) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2002, 11:31:18 |
|
||
|
BDE Client and deadlocks???
|
|||
|---|---|---|---|
|
#18+
Насчет deadlock'ов - отключи на время транзакции и проверь. Уровень изоляции поставь READ COMMITTED (tiReadCommitted в терминах дельфи) Если прекратится ошибка, значит, дело в неправильной стратегии работы с транзакциями. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2002, 11:37:20 |
|
||
|
BDE Client and deadlocks???
|
|||
|---|---|---|---|
|
#18+
А теперь эту фигню пишет уже в среде разработки, но в ней же нельзя выполнить FetchAll... ct_send(): user api layer: external error: this routine cannot be called because another command structure has results pending. Не могу изменить теперь ни одного обьекта в DataModule... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2002, 12:21:05 |
|
||
|
BDE Client and deadlocks???
|
|||
|---|---|---|---|
|
#18+
Database.Connected -> false ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2002, 12:28:42 |
|
||
|
BDE Client and deadlocks???
|
|||
|---|---|---|---|
|
#18+
Да уже полегчало, уже вроде бы все работает... Но есть прикол в том что когда запускаешь много клиентов, то первый открытый клиент работает быстрее чем остальные, а остальные че-то притормаживают... Причем смотрю в процессах приоритеты их равные. It's paradox...??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2002, 18:02:54 |
|
||
|
BDE Client and deadlocks???
|
|||
|---|---|---|---|
|
#18+
каким образом решил проблему ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2002, 19:00:25 |
|
||
|
BDE Client and deadlocks???
|
|||
|---|---|---|---|
|
#18+
В принципе я был с самого начала прав на счет клиентского курсора, только не знал как его делать, оказалость FetchAll возвращает данные на клиент не держа при этом курсор на сервере, при этом приложение значительно быстрее работает, так как ему не приходится все время дергать сервак, единственный недостаток этого подхода является работа с мнимыми данными, например пока я редактирую запись ее уже кто нибудь удалил, и че делать??? От этого меня раньше предохранял серверный курсор, так как он блокирует записи... но в принципе меня сейчас устраивает и клиентский курсор, а дальше будем думать, может чего-то и придумаем... To be continued... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2002, 20:16:18 |
|
||
|
BDE Client and deadlocks???
|
|||
|---|---|---|---|
|
#18+
Если это дубль, то я извиняюсь. Третий раз я не могу отправит ответ в этот топик. Первый раз ответ пропал где-то в середине обсуждения. Может это поможет, как мертвому припарки, но я писал - Попробуйте явно указывать ISOLATION LEVEL. ================ А вообще "Даешь ADO!!!" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2002, 20:46:55 |
|
||
|
BDE Client and deadlocks???
|
|||
|---|---|---|---|
|
#18+
За ADO я обеими руками, но я работаю под Sybase и там ADO глюк на глюке, даже connect глючит, пишет ошибка: разрушительный сбой(я лично такого еще не видел), поэтому решил не рисковать и писать все на BDE... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2002, 09:40:35 |
|
||
|
|

start [/forum/topic.php?all=1&fid=46&tid=1821840]: |
0ms |
get settings: |
6ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
40ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
35ms |
get tp. blocked users: |
1ms |
| others: | 193ms |
| total: | 299ms |

| 0 / 0 |
