2013-06-05 104 views
0

我的Java應用程序正試圖運行一個插入查詢到oracle數據庫。 我插入的表有一個DATE字段,名爲last_modified 我的查詢使用時間戳,同時指望oracle將其轉換爲日期字段。 每天23:00我碰到下面的錯誤Assertion botch:負面時間oracle 11

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應用程序)和數據庫機器是同一個。但我仍得到了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纔會使用新的時區。有沒有辦法讓我知道什麼是配置和什麼時區甲骨文使用? 謝謝。
+0

您的錯誤未完全粘貼。你不應該捕獲'RuntimeException's。你能顯示一些代碼嗎? – fge

+0

我不會推薦任何try/catch塊,因爲這將是一個骯髒的補丁。你應該找出發生這種情況的真正原因,也許發佈錯誤發生的代碼塊。我在想,你可能會有一些時間轉換,但這並沒有做好它的工作。 – Martin

+0

對不起,我無法粘貼我的代碼,但我所做的只是將java Timestamp類插入到oracle Date字段中。 – Oded

回答

0

有同樣的問題。我們通過使用vm參數來顯式設置Java時區來修復它。

-Duser.timezone=<yourTZ> 

這是一個奇怪的錯誤,當Date對象在另一端是正確的,但是當時間落入TZ間隙時仍然存在錯誤。

0

升級連接器的版本。如果您使用的是ojdbc,請更改爲新版本。我有同樣的問題,我使用ojdbc6。我升級到12.1.0.1後,所有工作正常