如何查找导致Oracle JDBC的数据:double下溢

时间:2018-06-05 10:49:49

标签: java oracle jdbc

我收到以下错误

  

引起:java.lang.IllegalArgumentException:下溢                  at oracle.jdbc.driver.OraclePreparedStatement.setDoubleInternal(OraclePreparedStatement.java:6604)   〜[ojdbc7-12.1.0.2.0-p0.jar:12.1.0.2.0]                  at oracle.jdbc.driver.OraclePreparedStatement.setDouble(OraclePreparedStatement.java:6574)   〜[ojdbc7-12.1.0.2.0-p0.jar:12.1.0.2.0] *

当我的数据对象中的一个double值为null /非法时,会发生这种情况。调用session.flush时会发生这种情况。问题是我的数据对象有其他数据对象和N个集合元素的组合。

很难找到哪个双重数据成员提供此问题。 我已启用持久性日志,但无法查看为update语句形成的查询。  除上述行外,日志上没有任何内容。我已经在所有get成员函数上添加了断点。调用session.update时没有发生异常。当session.flush被调用时会发生这种情况。有时候,由于我拥有大量的数据元素,因此会缩短会话时间。因此调试所有数据元素有点困难。

如何找到提出问题的成员?

2 个答案:

答案 0 :(得分:0)

你使用像Hibernate这样的东西吗?您可以启用调试或跟踪日志以显示生成的sql语句。 事实证明,即使Oracle JDBC具有可以启用的日志:

来自https://stackoverflow.com/a/40491028/66207

  1. 将启用跟踪的ojdbc jar文件放在类路径中。引用自 链接的Oracle页面:“要获取日志输出,必须使用调试 JAR文件,在文件名中用“_g”表示,如 ojdbc5_g.jar或ojdbc6_g.jar。“我的Oracle 11g安装包含
  2. 按照链接的Oracle所述创建logging.properties文件 页面,并根据您的需要调整日志记录级别。例如:

    .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“到你的JDBC应用程序的java启动命令。
  4. JDBC应用程序现在应该生成一个名为jdbc.log的文件,该文件应包含所需的信息。在某些情况下,可能需要指定logging.properties文件的完整路径。

    来自https://stackoverflow.com/a/1713464/66207的Hibernate解决方案:

    您需要为以下类别启用[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],第二个打印绑定参数等。

答案 1 :(得分:0)

启用以下属性后,我能够打印持久性日志:

sessionFactory-> cacheAccess->SessionFactory->jdbcservices->sqlStatementLogger->logToStdOut - >将此设置为TRUE。

现在打印了日志,我能够看到导致问题的数据。