Как найти данные, вызывающие Oracle JDBC: переполнение в два раза - PullRequest
0 голосов
/ 05 июня 2018

Я получаю следующую ошибку

Причина: java.lang.IllegalArgumentException: Недостаточное значение в oracle.jdbc.driver.OraclePreparedStatement.setDoubleInternal (OraclePreparedStatement.java:6604) ~ [ojdbc7-12.1.0.2.0-p0.jar: 12.1.0.2.0] в oracle.jdbc.driver.OraclePreparedStatement.setDouble (OraclePreparedStatement.java:6574) ~ [ojdbc7-12.1.0.2.0-p0.jar: 12.1.0.2.0] *

Это происходит, когда одно из значений типа double в моем объекте данных является нулевым / недопустимым.Это происходит, когда session.flush вызывается.Проблема в том, что мой объект данных имеет состав другого объекта данных и количество элементов коллекции N.

Трудно найти, какой двойной элемент данных вызывает проблему.Я включил постоянный журнал и не смог увидеть сформированный запрос для оператора обновления.В журнале нет ничего, кроме строки выше.Я установил контрольные точки для всех функций-членов get.Исключение не произошло, когда вызывается session.update.Это происходит, когда session.flush вызывается.Также иногда я получаю время сеанса, так как у меня огромное количество элементов данных.Таким образом, отладка всех элементов данных была немного трудной.

Как определить, какой член вызывает проблему?

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Мне удалось распечатать журнал сохранения после включения следующего свойства:

sessionFactory-> cacheAccess->SessionFactory->jdbcservices->sqlStatementLogger->logToStdOut -> установить значение TRUE.

Теперь журналы были напечатаны, и я смогпосмотрите данные, которые вызвали проблему.

0 голосов
/ 05 июня 2018

Вы используете что-то вроде Hibernate?Вы можете включить отладку или журнал трассировки, чтобы показать сгенерированные операторы sql.Оказывается, даже в Oracle JDBC есть журнал, который можно включить:

С https://stackoverflow.com/a/40491028/66207:

  1. Поместите файл jar ojdbc с поддержкой трассировки в путь к классам.Цитата со связанной страницы Oracle: «Чтобы получить вывод журнала, вы должны использовать файлы JAR отладки, которые обозначены« _g »в имени файла, например ojdbc5_g.jar или ojdbc6_g.jar.»Моя установка Oracle 11g содержала
  2. Создайте файл logging.properties, как описано на связанной странице Oracle, и настройте уровни ведения журнала в соответствии со своими потребностями.Пример:

    .level=SEVERE oracle.jdbc.level=FINEST
    oracle.jdbc.handlers=java.util.logging.FileHandler
    java.util.logging.FileHandler.level=FINEST
    java.util.logging.FileHandler.pattern=jdbc.log
    java.util.logging.FileHandler.count=1
    

    java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter

  3. Добавить свойства JVM "-Doracle.jdbc.Trace = true-Djava.util.logging.config.file = logging.properties "к команде запуска java для вашего приложения JDBC.

Приложение JDBC должно теперь создать файл с именем jdbc.log, который должен содержатьжелаемая информация.В некоторых случаях может потребоваться указать полный путь к файлу logging.properties.

Или Hibernate Solution от https://stackoverflow.com/a/1713464/66207:

Вам необходимо включить [logging][2] для следующих категорий:

  • org.hibernate.SQL - установите на debug, чтобы регистрировать все операторы SQL DML по мере их выполнения
  • org.hibernate.type - установите на trace для регистрации всех параметров JDBC

Таким образом, конфигурация log4j может выглядеть следующим образом:

# logs the SQL statements
log4j.logger.org.hibernate.SQL=debug 

# Logs the JDBC parameters passed to a query
log4j.logger.org.hibernate.type=trace 

Первый эквивалент hibernate.show_sql=true legacy [property] [1],second печатает связанные параметры среди прочего.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...