Oracle не возвращает реальные exeptions

Большой Синий Кит
Дата: 24.03.2011 20:59:47
Доброго всем времени суток! Подскажите, пожалуйста, куда копать - возможно, кто знает.

Интересная проблема (для меня во всяком случае). Оракл 11g. Используется jdbc драйвер ojdbc5-11.2.0.2.0.jar. Соответственно, запросы выполняются из ява-приложения.

При неудачных попытках выполнить какую-либо query, оракл не возвращает ее код (ORA-***), а возвращает что-то вроде:

oracle
Internal Exception: java.sql.SQLException: IO Error: Size Data Unit (SDU) mismatch
Error Code: 17002


Например, это описание выпадало для unique constraint violation.

На драйвер не грешу, на настройки приложения тоже - потому что с данным же драйвером и с теми же настройками приложения на другом инстансе оракла все в порядке.

Подскажите, пожалуйста, уважаемые специалисты, нет ли у оракла какой-то хитрой настройки, благодаря которой он не передает реальные коды ошибок стороннему приложению, выполняющему на нем sql-запросы? Может, какие-то секурные настройки?

Очень буду благодарен! Спасибо всем откликнувшимся!
______________________________________________________
while(!death){
Life.liveAndBeHappy();
}
softwarer
Дата: 24.03.2011 21:36:16
А чем другой инстанс отличается от этого? Версией, патчами, операционкой...

Я бы для начала посоветовал Вам попробовать подключить oci драйвер вместо thin - подозреваю, ошибка уйдёт. А вообще гугль много что говорит на тему этой ошибки, и первые рекомендации - обновить драйвер итп.
-2-
Дата: 24.03.2011 21:44:03
Может при ответе сервер не может послать клиента на три буквы? листенер.лог и на клиенте - trace_level_client=support (jdbc thick/oci).
Большой Синий Кит
Дата: 24.03.2011 22:51:14
Большое спасибо за ответы!

softwarer
Я бы для начала посоветовал Вам попробовать подключить oci драйвер вместо thin - подозреваю, ошибка уйдёт. А вообще гугль много что говорит на тему этой ошибки, и первые рекомендации - обновить драйвер итп.

Да, я долго и нужно рыскал по гуглю и натыкался на подобного рода эксепшины, которые были связаны с драйвером. На данный момент, сложилось мнение, что дело все же не в релизе данного драйвера, потому что подобных случаев с этой версией драйвера и этой версией оракла я не встречал. Обычно упоминалось использование драйвера более высокой версии к ораклу более низкой версии и т.п... В общем, при несоответствии версий. И относилось это обычно к 8-9 версии оракла.

К сожалению, большая проблема в том, что я не знаю какие патчи были установлены на инстанс оракла - и это бесит. Эту информацию мне никто предоставить не может.Операционные системы идентичные. Версии идентичные. (просто верю на слово, потому что проверить сам просто не могу).

-2-
Может при ответе сервер не может послать клиента на три буквы? листенер.лог и на клиенте - trace_level_client=support (jdbc thick/oci).


trace_level_client - это ведь только для OCI клиента, да? То есть если он = support на thin клиенте может вывалится IO Error: Size Data Unit (SDU) mismatch?

Кстати говоря,
oracle.jdbc.thin.level = это установка для логгирования операций на сервере ведь, не то, что передается клиенту?
Большой Синий Кит
Дата: 24.03.2011 22:53:46
Хотя, безусловно, с учетом того, что в thin драйвере реализована своя имлементация TCP/IP версия SQL*Net протокола на сокетах, то SDU mismatch очень напоминает ошибку в ее имплементации...
Андрей Панфилов
Дата: 24.03.2011 23:19:28
softwarer
А вообще гугль много что говорит на тему этой ошибки, и первые рекомендации - обновить драйвер итп.
непонятно как Вы такой вывод сделали...

//http://www.vamsipavan.com/blog/javasqlsqlexception-io-exception-invalid-packet-lenght/

автор
All these occur almost with same reason. It is caused when more than one thread is trying to make simultaneous use of the thin Oracle JDBC driver via the same Connection object.
В переводе с английского - в приложении присутствует говнокод и его нужно исправить.
softwarer
Дата: 24.03.2011 23:54:19
Андрей Панфилов
непонятно как Вы такой вывод сделали...

Да хотя бы по Вашей же ссылке английским языком написано.

Андрей Панфилов
В переводе с английского - в приложении присутствует говнокод и его нужно исправить.

И даже сказано, как именно: OR upgrade to a later version of the driver.
Андрей Панфилов
Дата: 25.03.2011 00:20:18
softwarer
OR upgrade to a later version of the driver
это уже домыслы автора блога вот, сравните:

9i
The Oracle JDBC drivers provide full support for programs that use Java multithreading. The following example creates a specified number of threads and lets you determine whether or not the threads will share a connection. If you choose to share the connection, then the same JDBC connection object will be used by all threads (each thread will have its own statement object, however).

Because all Oracle JDBC API methods are synchronized, if two threads try to use the connection object simultaneously, then one will be forced to wait until the other one finishes its use.
10g/11g
The Oracle JDBC drivers provide full support for, and are highly optimized for, applications that use Java multithreading. Controlled serial access to a connection, such as that provided by connection caching, is both necessary and encouraged. However, Oracle strongly discourages sharing a database connection among multiple threads. Avoid allowing multiple threads to access a connection simultaneously. If multiple threads must share a connection, use a disciplined begin-using/end-using protocol.
т.е. паттерн от версии к версии меняется и я бы не сказал, что в сторону облегчения жизни
softwarer
Дата: 25.03.2011 00:45:41
Андрей Панфилов
это уже домыслы автора блога

В том, что я сходу нагуглил, этот совет был доминирующим. А в остальном - главное чтобы у автора заработало. Я так вообще не очень понимаю смысла делить сессию между потоками, имхо это прямой путь к нетривиальным проблемам (хотя бы коммита невовремя).
Большой Синий Кит
Дата: 25.03.2011 00:51:09
Андрей Панфилов, спасибо за отклик!

Я первым делом нашел данную ссылку и прочел. Но тут дело с большой вероятностью не в мултитрединге. Приложение многопоточное, да. Но данное приложение с идентичными настройками, с идентичными выполняемыми операциями, с идентичным драйвером jdbc, идентичными настройками connection pool на "нормальном" инстансе оракла работает на ура! То есть на "нормальном" инстансе оракла если воспроизвести ситуацию неправильного инсерта оракл возвращает РЕАЛЬНЫЙ эксепшин - а в случае выполнения данной операции на проблемном инстансе оракла, пробрасывает Size Data Unit (SDU) mismatch! И это все при выполнении ОДНОГО и ТОГО же кода! При наличии ОДИНАКОВОГО количества потоков, которые выполняют ОДИНАКОВЫЕ действия.

Кстати говоря, упоминаемый в статье эксепшин
java.sql.SQLException: Closed Connection
может быть и вовсе не из-за мултитрединга - а просто при попытке закрыть коннекшин, который уже был закрыт, например в излишнем final блоке. Поэтому уже создается некоторое подозрительное отношение к данной статье :)

Безусловно, я не могу полностью исключить вероятность мултитредового говнокода, но в данной ситуации это для меня выглядит сомнительно...