?

Log in

No account? Create an account
dump -0f - /dev/mind
Я знаю Haskell, OCaml, GSM, эндофункторы и много других страшных слов
Он сказал: "поехали!" 
17th-Aug-2009 10:02 pm
Он - это пресс-релиз. На самом деле, там еще есть пару мелких углов, но вписывать прибавку к EXP и ЧСВ можно уже сейчас. Я там собирал требования, писал кучи документов, мигрировал данные и интегрировал все добро в одну кучу. Вот какой я молодец

Впрочем, не обошлось без казусов. Некие бравые ребята написали на PL/SQL пакетик процедур, и, натурально, вставили его в Oracle. Другие бравые ребята взяли программу на C#.Net и давай оттуда эти процедуры использовать.

В тестовом окружении (Oracle 8.1.7) - все шикарно. В промышленном (Oracle 9i) - не выходит каменный цветок. Лишь только пытаешься вызвать какую-то процедуру - Оракл тут же говорит ORA-03113, end-of-file on communication channel. И закрывает соединение со своей стороны.

При этом с того же самого компьютера можно подключиться к базе при помощи sqlplus, вызвать искомую процедуру и получить результат. Без всяких ошибок. Хоть раз, хоть десять.

Разработчики на PL/SQL, естественно, тут же воспряли духом - ага, баг не у нас, оказывается! Только толку от этого знания немного - надо же, чтобы в конце-концов все заработало и в приложении на C#.Net.

Разработчики на C# говорят: это все потому, что мы ходим через ODBC. Однако фиг - утилита ODBC Test, написанная (судя по виду GUI) еще во времена Windows 3.1, замечательным образом вызывает процедуры через ODBC.

Тогда разработчики на C# говорят: это все потому, что мы все переписали и теперь работаем через OleDb. Надо поставить ораклового клиента и использовать ODP.NET оттуда. Поставили. Однако фиг - как падало, так и падает. Причем, только с Oracle 9i - с 8.1.7 по-прежнему все хорошо.

Тогда разработчики на C# говорят: это у вас фиговый Оракл. Но их посылают в сад, так как "у меня нет для вас другого Оракла, товарищ Жуков".

Параллельно все участники процесса насилуют Google в поисках других товарищей по несчастью. Классик говорил: "если любишь заглядывать в бездну, помни, что бездна может заглянуть в тебя". Так и происходит: гугл приносит мешок рассказов о том, как по всему земному шару люди бьются лбом об стену с ORA-03113.

Типичные истории звучат примерно так: "Мы тут написали софтину на C#.NET, которая ходит в оракл. С версией 9i и ODP 9.0.1.3.1 все было хоршо, но потом мы обновили ODP до 9.0.1.3.3 и началось - ORA-03113 через пол-часа работы. Мы два месяца плясали с отладчиками, и поняли: у нас на клиентской стороне connection pool, а Оракл со своей стороны временами закрывает соединения по тайм-ауту. В пуле они не инвалидируются, и когда такое соединение выбирается для выполнения запроса, возникает ORA-03113. Мы не можем убрать пул (все тормозит) и не можем убрать отключение по тайм-ауту (требование безопасности). Более того - мы откатили ODP, но проблема осталась! Помогите!". Читаешь, и понимаешь, что у нас еще не все так плохо :)

Хоть у нас все и падает сразу и пул явно ни при чем - попробовали поиграться с его отключением или параметрами. А вот фиг.

В конце-концов разработчики на C# говорят: "Мы сдаемся! К вам едет "мистер Вульф, который решает пробемы" (Криминальное чтиво).". Приезжает человек, который занимается исключительно troubleshooting-ом разной неведаной фигни.

Человек целый день колдует с компилятором C# и кучей разных библиотек и в конце-концов говорит: "я не знаю, что бы это значило, но факт таков - если я до вызова процедуры сделаю хотя бы один select, то все работает хорошо". Проверяем - натурально, так оно и есть. Может, дело в каких-то миллисекундных паузах? Нет, расставленные по коду паузы не помогают.

Пляски с бубном продолжаются еще день, но без особого результата. В конце-концов принимается волевое решение о том, что код на C# должен после открытия соединения сделать "select table_name from all_tables where owner=current_user" и вычитать первый элемент рекордсета.

И все начинает работать без сучка и задоринки. Мораль придумайте сами.
Comments 
17th-Aug-2009 07:06 pm (UTC)
where rownum<=1 неплохо бы к такому селекту добавить, чтобы уж совсем без оверхита обойстись.
(Deleted comment)
17th-Aug-2009 07:06 pm (UTC)
Использование ODBC в 2009 году в серьёзном инфраструктурном проекте это ещё круче, чем описанный баг.
17th-Aug-2009 07:06 pm (UTC)
Это да. Нативные драйвера придумали трусы.
17th-Aug-2009 07:07 pm (UTC)
Ааафигительно!!!
17th-Aug-2009 07:11 pm (UTC)
а что в хачестве дискового хранилища? я насколько помню, центральный офис МТС в москве использовал EMC
17th-Aug-2009 07:12 pm (UTC)
FileNet P8

Касательно центрального офиса в МТС у меня другие сведения - если у них и есть EMC, то не для этих целей.
17th-Aug-2009 07:11 pm (UTC)
Почему у меня жотское чувства дежавю, что эту историю с селектом я уже где то слышал. Пару лет назад. Но в упор не могу вспомнить с кем она приключилась...
17th-Aug-2009 07:12 pm (UTC)
Эх, грабли-костылики... классика жанра.
17th-Aug-2009 07:16 pm (UTC)
$magic = true;
# your code here
17th-Aug-2009 07:20 pm (UTC)
Кстати, а вот всегда интересовало - а сам Оракл не помогает в таких случаях? Ведь по идее за лицензию не один десяток тысяч зелёных отвален - они не дают технический саппорт в таких случаях?
17th-Aug-2009 07:23 pm (UTC)
Оракл сказал - в 10i все будет. Но апгрейд на десятку по целому ряду причин был невозможен.
17th-Aug-2009 07:20 pm (UTC)
Anonymous
А если вдруг (мнение дилетанта) написать обработку ORA-03113, и при её возникновении переинициализировать пул?
17th-Aug-2009 07:21 pm (UTC)
Не заметил, что не залогинен...
17th-Aug-2009 07:23 pm (UTC)
Супер, спасибо! :)
17th-Aug-2009 07:40 pm (UTC)
налетали в июле, разобрались за час, просто сообщение дебильное
p.s. до сих пор на 9ке, ибо у государства нет денег :)
17th-Aug-2009 07:41 pm (UTC)
Просто интересно - а в каком контексте налетали и как разобрались?
17th-Aug-2009 07:52 pm (UTC)
Ых, сколько денег народ распилил за тот проект, который вы переделывали. Некоторые даже свечные заводики в Самаре прикупили :)
17th-Aug-2009 08:08 pm (UTC)
Меня ж туда тоже под конец затащило (и потрепало).

Зато мои мучения на том проекте тут вернулись сторицей - все разложенные грабли были известны и т.п.
17th-Aug-2009 08:01 pm (UTC)
много мун назад. Когда я еще писал большую корпоративную систему на ПХП и Оракле (это еще похлеще приведенного примера) эта ошибка нас приследовала очень долго. Притом она была только на тестовом стенде. В продакшене ее не было. Очень долго ковыряли. Наковыряли примерно следующее (для нашего случая): есть внутри этого ЧЯ какой-то магический таймер, и какая-то магическая операция. И вот если эа операция не успела отпахать за эти ничтожные мгновения - EOF. Победили переорганизацией и дефрагментацией тейблспейсов.
17th-Aug-2009 08:13 pm (UTC)
Извините. А почему именно C# ?
17th-Aug-2009 08:43 pm (UTC)
Выбор был обусловлен тем, как я понимаю, на чем была написана система, с которой интегрировались.

Это смежники делали, и выбора особого не предлагали.
17th-Aug-2009 08:51 pm (UTC)
по идее, должно было быть достаточно выполнять "select 1" перед использованием коннекта
а сам по себе валидировать коннект перед использованием пул не умеет?
17th-Aug-2009 09:01 pm (UTC)
Про пул - ничего не знаю, т.к. наша проблема была не в пуле. По крайней мере, его отключение нам не помогало.

А с простыми select-ами вроде бы тоже экспериментировали, но остановились на сложном. Подозреваю, что не просто так :)
Page 1 of 2
<<[1] [2] >>
This page was loaded Oct 20th 2019, 7:10 pm GMT.