Assertion botch:负面时间oracle 11

时间:2013-06-05 11:12:43

标签: java oracle jdbc oracle11g timestamp-with-timezone

我的java应用程序正在尝试对oracle DB运行插入查询。 我要插入的表有一个名为last_modified的DATE字段 我的查询使用Timestamp,同时依靠oracle转换为date字段。 每天23:00我都会收到以下错误

java.lang.RuntimeException: **Assertion botch: negative time**
at
oracle.jdbc.driver.DateCommonBinder.setOracleHMS(OraclePreparedStatement.java:18740)
    at
oracle.jdbc.driver.TimestampBinder.bind(OraclePreparedStatement.java:19245)
    at
oracle.jdbc.driver.OraclePreparedStatement.setupBindBuffers(OraclePreparedStatement.java:3014)
    at
oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:9973)
    at
oracle.jdbc.driver.OracleStatementWrapper.executeBatch(OracleStatementWrapper.java:213)

我使用以下方式检查了时区:

SELECT SYSTIMESTAMP, CURRENT_TIMESTAMP, DBTIMEZONE, SESSIONTIMEZONE FROM DUAL;

我得到了:05-JUN-13 08.09.29.244232 AM +02:00, 05-JUN-13 08.09.29.244236 AM +02:00, +00:00,+02:00

客户端mochine(我有java应用程序的那个)和DB机器是同一个。但我仍然得到java.lang.RuntimeException: Assertion botch: negative time

我的问题是:

  1. 如何在代码中添加一个catch块,以避免每天23:00重新启动应用程序?在我看来,例外是java.lang.RuntimeException而我无法添加catch(java.lang.RuntimeException e)或者我可以吗?

  2. Assertion botch: negative time一个断言?我可以使用catch (java.lang.AssertionError e)来抓住它吗?

  3. 我读到,在更改linux时区后,我应该在机器上重启。直到那时,oracle将不会使用新的时区。有没有办法让我知道配置什么以及oracle使用的是什么时区? 感谢。

2 个答案:

答案 0 :(得分:1)

有同样的问题。我们通过使用vm parametr来明确设置Java时区来修复它。

-Duser.timezone=<yourTZ>

这是一个奇怪的错误,当Date对象在另一端是正确的时候,但是当时间落入TZ间隙时仍然是bug。

答案 1 :(得分:0)

升级连接器的版本。如果您使用的是ojdbc,请更改为较新的版本。我有同样的问题,我正在使用ojdbc6。升级到12.1.0.1后,一切正常。