|
|
|
DOA Много потоков External exception EBF00BAA
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Delphi 10.2 DOA 4.1.3 OracleInstantClient 12_2 Создаю 1, 2, 5, 15 или 20 потоков для записи данных в БД. В кажом потоке создаются свои OracleSession и OracleQuery. Все работает хорошо. При увеличении количества потоков МОЖЕТ происходить External exception EBF00BAA. Не всегда и не во всех потоках. На форумах DOA пишут, что для недопущении этой ошибки нужно OracleSession.ThreadSafe:=True И да, это помогает, НО разработчики DOA говорят, что если сессия в отдельном потоке, то OracleSession.ThreadSafe:=True ставить не нужно . Можно было бы конечно оставить OracleSession.ThreadSafe:=True , но из-за этой опции немного снижается производительность. А мне это критично. Подскажите, может кто-то сталкивался с таким поведением? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2018, 08:41 |
|
||
|
DOA Много потоков External exception EBF00BAA
|
|||
|---|---|---|---|
|
#18+
cptngrb, а что для тебя критичнее - стабильность или более быстрая работа, но с External exception и вероятностью крэша приложения? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2018, 09:28 |
|
||
|
DOA Много потоков External exception EBF00BAA
|
|||
|---|---|---|---|
|
#18+
asutp2, для меня важнее стабильность, но хочется полной ясности почему так происходит ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2018, 10:21 |
|
||
|
DOA Много потоков External exception EBF00BAA
|
|||
|---|---|---|---|
|
#18+
cptngrb OracleSession.ThreadSafe:=True И да, это помогает, НО разработчики DOA говорят, что если сессия в отдельном потоке, то OracleSession.ThreadSafe:=True ставить не нужно Наверно, это они так планировали, а на деле заюзали какую-то глобальную переменную или еще что. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2018, 13:04 |
|
||
|
DOA Много потоков External exception EBF00BAA
|
|||
|---|---|---|---|
|
#18+
YuRock, Вот пытаюсь в исходниках найти это место. Думал, может уже кто-то нашел ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2018, 14:17 |
|
||
|
DOA Много потоков External exception EBF00BAA
|
|||
|---|---|---|---|
|
#18+
cptngrb, OraSession создается в конструкторе потока или в Execute? Попробуйте перенести в Execute ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2018, 14:23 |
|
||
|
DOA Много потоков External exception EBF00BAA
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, В конструкторе. В Execute попробовать можно, но не слишком ли много накладных расходов? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2018, 15:39 |
|
||
|
DOA Много потоков External exception EBF00BAA
|
|||
|---|---|---|---|
|
#18+
cptngrbне слишком ли много накладных расходов?Каких? У Вас объект создается в одном потоке, а используется в другом И, я надеюсь, Вы ему никакого Owner не передаете? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2018, 16:01 |
|
||
|
DOA Много потоков External exception EBF00BAA
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, Вы имеете не мой цикл while not Terminated do в методе Execute, а один раз в начале Execute? Если так, то ошибка остается. А если создавать session + query перед каждым выполнением запроса, то расходы на создание, а потом и на очищение этих объектов будут ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2018, 16:11 |
|
||
|
DOA Много потоков External exception EBF00BAA
|
|||
|---|---|---|---|
|
#18+
Нет, никаких Owner'ов нет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2018, 16:12 |
|
||
|
DOA Много потоков External exception EBF00BAA
|
|||
|---|---|---|---|
|
#18+
Если создавать и удалять при каждом выполнении - ошибка остается ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2018, 16:20 |
|
||
|
DOA Много потоков External exception EBF00BAA
|
|||
|---|---|---|---|
|
#18+
cptngrb, Не очень понятно, что конкретно вызывает External Exception: DOA, OracleClient или сервер. Нельзя ли подключить исходники DOA в режиме отладки и выяснить какой модуль вызывает исключение? Есть ли ограничение у сервера Oracle на количество одновременных сессий? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2018, 16:27 |
|
||
|
DOA Много потоков External exception EBF00BAA
|
|||
|---|---|---|---|
|
#18+
Конструктор потока Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. Выполнение запроса в Execute потока: Код: pascal 1. 2. 3. 4. 5. 6. ; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2018, 16:31 |
|
||
|
DOA Много потоков External exception EBF00BAA
|
|||
|---|---|---|---|
|
#18+
cptngrbКонструктор потока Код: pascal 1. Хотя бы подключение перенес в Execute, не говоря о создании объектов. Это же долгая операция, зачем один поток должен все их делать. cptngrb_Vasilisk_, Вы имеете не мой цикл while not Terminated do в методе Execute, а один раз в начале Execute? Конечно же, он имел ввиду это. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2018, 16:39 |
|
||
|
DOA Много потоков External exception EBF00BAA
|
|||
|---|---|---|---|
|
#18+
cptngrbYuRock, Вот пытаюсь в исходниках найти это место Ищи, на что влияет ThreadSafe (впрочем, это тебе и так понятно, но мне больше нечего предложить, у меня и DOA нет). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2018, 16:40 |
|
||
|
DOA Много потоков External exception EBF00BAA
|
|||
|---|---|---|---|
|
#18+
cptngrb, В каком месте вызывается External Exception : в конструкторе или в Execute? Поставь try except блок в каждой процедуре. После того как выделишь процедуру, выясни на какой конкретной строке в процедуре вылетает. Подозреваю, что либо на LogOn либо на Query.Execute. А может данные некорректны? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2018, 16:53 |
|
||
|
DOA Много потоков External exception EBF00BAA
|
|||
|---|---|---|---|
|
#18+
YuRock, Я не понимаю разницы между созданием объектов в конструкторе потока или Execute? Долго, медленно, на что это может повлиять? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2018, 16:53 |
|
||
|
DOA Много потоков External exception EBF00BAA
|
|||
|---|---|---|---|
|
#18+
Belotsky Serge, Ошибка вылетает на OracleQuery.Execute. Все операции обернуты в try/except и ведется лог ошибок ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2018, 16:54 |
|
||
|
DOA Много потоков External exception EBF00BAA
|
|||
|---|---|---|---|
|
#18+
cptngrbYuRock, Я не понимаю разницы между созданием объектов в конструкторе потока или Execute? "в конструкторе" отрабатывает в потоке, который создает объект нового потока. "Execute" - это уже в новом потоке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2018, 16:55 |
|
||
|
DOA Много потоков External exception EBF00BAA
|
|||
|---|---|---|---|
|
#18+
cptngrbДолго, медленно, на что это может повлиять? На время работы - это однозначно. А еще - мало ли. Может, там какой-то threadvar используется - в этом случае при создании в одном потоке будет использована одна переменная, а при обращении из другого - другая. Это может быть важно. Но вообще это вряд ли, конечно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2018, 16:58 |
|
||
|
DOA Много потоков External exception EBF00BAA
|
|||
|---|---|---|---|
|
#18+
Тааааак. Перенес в блок Execute создание объектов. Ошибка начала появляется иногда и на LogOn. Теперь есть куда копать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2018, 17:05 |
|
||
|
DOA Много потоков External exception EBF00BAA
|
|||
|---|---|---|---|
|
#18+
cptngrbОшибка начала появляется иногда и на LogOnТогда вот этомуcptngrbразработчики DOA говорят, что если сессия в отдельном потоке, то OracleSession.ThreadSafe:=True ставить не нужно .верить не стоит. Ошибка вываливается при обращении к клиентской библиотеке в другом потоке. Раньше у Вас это был только Execute, а теперь и LogOn добавился ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2018, 18:27 |
|
||
|
DOA Много потоков External exception EBF00BAA
|
|||
|---|---|---|---|
|
#18+
верить может и не стоить, но по крайней мере в процедуре LogOn они не виноваты. В клиентская библиотеке не потокобезопасна OCISessionBegin (в этом месте плавающая ошибка). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2018, 09:45 |
|
||
|
DOA Много потоков External exception EBF00BAA
|
|||
|---|---|---|---|
|
#18+
Хотя, как они не виноваты (DOA), когда от ThreadSafe зависит в каком режиме будет работать OCI.dll. Всем спасибо за внимание. Вопрос закрыт. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2018, 10:42 |
|
||
|
DOA Много потоков External exception EBF00BAA
|
|||
|---|---|---|---|
|
#18+
Думал, думал и решил провести тесты на 32-разрядной версиях oci.dll и DOA, так как старшие товарищи сказали, что все у них работает хорошо и вообще... оказались правы. Подобной ошибки не наблюдалось. Ошибка только в 64-разрядах. Если кому-нибудь удалось побороть, то прошу отозваться ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2018, 11:32 |
|
||
|
DOA Много потоков External exception EBF00BAA
|
|||
|---|---|---|---|
|
#18+
Кстати, FireDAC тоже использует oci.dll и проблем с 32/64 не наблюдалось. Но DOA немного быстрее, а мне это критично. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2018, 11:34 |
|
||
|
DOA Много потоков External exception EBF00BAA
|
|||
|---|---|---|---|
|
#18+
Удалось побороть, вроде бы. Вдруг кому-то понадобиться. В Oracle.pas в процедуре TOracleSession.GetEnv условие Код: pascal 1. заменяем на Код: pascal 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2018, 15:18 |
|
||
|
DOA Много потоков External exception EBF00BAA
|
|||
|---|---|---|---|
|
#18+
cptngrbУдалось побороть, вроде бы. Вдруг кому-то понадобиться. В Oracle.pas в процедуре TOracleSession.GetEnv условие Код: pascal 1. заменяем на Код: pascal 1. Да, хороший баг. oci.dll думала, что она не используется из разных потоков, если не поставить ThreadSafe := True, получается. Понятное дело, что в таком случае крэшилось, даже если 1 коннект = 1 поток, но таких потоков несколько. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2018, 16:57 |
|
||
|
DOA Много потоков External exception EBF00BAA
|
|||
|---|---|---|---|
|
#18+
cptngrbУдалось побороть, вроде бы. Вдруг кому-то понадобиться. В Oracle.pas в процедуре TOracleSession.GetEnv условие Код: pascal 1. заменяем на Код: pascal 1. А не проще Threadsafe в True установить ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2018, 17:22 |
|
||
|
DOA Много потоков External exception EBF00BAA
|
|||
|---|---|---|---|
|
#18+
Проще, но ThreadSafe влияет не только на работу oci.dll, но и на "обертку" DOA, заставляя многие операции выполнять в крит. секции, а это дополнительные накладные расходы, а мне важно (конкретно в этом случае) выигрыш нескольких сотен мс на каждой операции. Если быстродействие не так сильно важно, то лучше ставить ThreadSafe = True и не париться ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2018, 08:45 |
|
||
|
DOA Много потоков External exception EBF00BAA
|
|||
|---|---|---|---|
|
#18+
cptngrbПроще, но ThreadSafe влияет не только на работу oci.dll, но и на "обертку" DOA, заставляя многие операции выполнять в крит. секции, а это дополнительные накладные расходы, а мне важно (конкретно в этом случае) выигрыш нескольких сотен мс на каждой операции. Если быстродействие не так сильно важно, то лучше ставить ThreadSafe = True и не париться Когда в следующий раз вылезут глюки, вспомни 21259629 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2018, 10:43 |
|
||
|
DOA Много потоков External exception EBF00BAA
|
|||
|---|---|---|---|
|
#18+
cptngrbКстати, FireDAC тоже использует oci.dll и проблем с 32/64 не наблюдалось. Но DOA немного быстрее, а мне это критично.у тебя что, там 1000 запросов в секунду что ли делается? может стоит поменять архитектуру приложения вместо того, чтобы явно включать режим возможных багов? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2018, 10:58 |
|
||
|
DOA Много потоков External exception EBF00BAA
|
|||
|---|---|---|---|
|
#18+
asutp2, не 1000, а 50 потоков пишут по 6 массивов размером 500000 элементов, и когда SetVariable массивов 20 секунд, то это очень долго. И выигрыш в 5-7 секунд это много для меня ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2018, 16:07 |
|
||
|
DOA Много потоков External exception EBF00BAA
|
|||
|---|---|---|---|
|
#18+
20 секунд это когда все нормально, а бывает и 2 минуты, и 4 минуты. И вот это уже неприемлемо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2018, 16:09 |
|
||
|
DOA Много потоков External exception EBF00BAA
|
|||
|---|---|---|---|
|
#18+
cptngrb, Возможно, стоит подумать над тем, чтобы потоки заменить на процессы, которые не добавляют OCI_Threaded в EnvMode (и, конечно, не ставят ThreadSafe в True). Это даст профит для менеджера памяти oci.dll - не будет блокировок. А в твоем нынешнем варианте - они будут при любом дерганье памяти внутри неё. Я, конечно, не знаю, какой там менеджер памяти, может - и "самый быстрый в мире и без блокировок" (с), может, и системный, но оба варианта маловероятны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2018, 16:27 |
|
||
|
|

start [/forum/topic.php?all=1&fid=58&tid=2041141]: |
0ms |
get settings: |
7ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
147ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
43ms |
get tp. blocked users: |
1ms |
| others: | 214ms |
| total: | 434ms |

| 0 / 0 |
