Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Осторожнее с JDBC 12.1.0.1.0 и фреймворками  [new]
Bobby Z.
Member

Откуда: NJ USA
Сообщений: 351
Попробовали новый драйвер и налетели на замечательный баг: начиная с 12c драйвер стал поддерживать PreparedStatement.getParameterMetaData().getParameterType() (до этого выкидывал SQLException: Unsupported feature), но лучше бы они этого не делали, по крайней мере так, как сделали...
Реализация - кривее некуда. Они добавили новый класс под названием oracle.jdbc.driver.OracleParameterMetaDataParser, который берет ваш стейтмент, пытается его разобрать, вытащить из него имена таблиц и колонок, и построить SELECT из этих таблиц с этими колонками, после чего этот SELECT сам парсится и из него естественным образом получаются типы колонок. И вот тут начинается веселье, потому что разбор вашего стейтмента делается некорректно, результирующий SELECT синтаксически неверен и (фиг знает почему, вроде как закрытие стейтмента в finally{} есть,) в сессии начинают очень быстро утекать курсоры. И не любит этот новый парсер, судя по моим тестам, исключительно идентификаторы, начинающиеся на A, F и O: любой, начинающийся с F, превращается просто в F или вообще теряется, а начинающиеся с A и O теряют следующий символ (или, в случае с A, тоже вообще теряются.) В классе есть метод main(), который принимает в качестве аргументов -test для прогона полусотни встроенных тесткейсов, или ваши стейтменты и показывает какой SELECT он для них генерирует. И вот что он делает:

>java -classpath ojdbc7.jar oracle.jdbc.driver.OracleParameterMetaDataParser "SELECT WHATEVER FROM sometab WHERE F123=? OR A123=? OR O123=?"
SQL:SELECT WHATEVER FROM sometab WHERE F123=:1  OR A123=:2  OR O123=:3
  SqlKind:SELECT, Parameter Count=3
  Parameter SQL: SELECT F, A23, O23 FROM sometab

>java -classpath ojdbc7.jar oracle.jdbc.driver.OracleParameterMetaDataParser "SELECT WHATEVER FROM FAIL_REALLY_EPIC WHERE F123=? OR A123=? OR O123=?"
SQL:SELECT WHATEVER FROM FAIL_REALLY_EPIC WHERE F123=:1  OR A123=:2  OR O123=:3
  SqlKind:SELECT, Parameter Count=3
  Parameter SQL: SELECT A23, O23 FROM F


Пакость бага состоит в том, что всякие фреймворки getParameterMetaData().getParameterType() дергают автоматически. Если они при этом получают SQLException, то он проглатывается и фреймворк там что-то принимает по умолчанию и до 12-й версии драйвера все это прекрасно работало. А с 12-й иногда, если вам не очень повезло с идентификаторами, вылезает этот косяк - и мы, например, убили день, чтобы понять, откуда вдруг у нас полезли эти левые селекты, когда бы делаем update. И в данном случае наши Java девелоперы оказались правы и косяк, действительно, у Оракла, а не у них в их чудо-фреймворках. :D Как вообще этот код тестировался, интересно мне знать...

В общем, будьте осторожны. SR пока не открыт, но скоро будет, так что не заморачивайтесь с открытием своих.
24 сен 13, 00:45    [14875367]     Ответить | Цитировать Сообщить модератору
 Re: Осторожнее с JDBC 12.1.0.1.0 и фреймворками  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54384
Был у меня случай, тоже связанный с ораклом, сторонней библиотекой, препарсом запросов и магией имен
+
http://forums.allroundautomations.com/ubb/ubbthreads.php?ubb=showflat&Number=8115&PHPSESSID=2e3c1b028a66500ae8a1730abc88b993
OracleDataSet1.SQL.Text =>
select * from "ZAKAZ_CEX"
where 1=2
OracleDataSet.GetUpdatingAlias => ZAKAZ_CEX

OracleDataSet1.SQL.Text =>
select * from "ZAKAZ"
where 1=2
OracleDataSet.GetUpdatingAlias => 1

DOA 4.0.6, Delphi 7
24 сен 13, 08:32    [14875646]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить