首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Hibernate 於 WebSphere 連線池提交交易遭遇 NullPointerException 解決紀錄

     編輯:Java 相關知識

問題現象

應用部署於 WebSphere Application Server (WAS) 5.1,使用 WAS 資料源連線池。處理大量 session.save(object) 後,呼叫 trans.commit() 拋出 NullPointerException,堆疊追蹤指向 Oracle JDBC 驅動與 WAS 連線包裝類:

java.lang.NullPointerException
 at oracle.jdbc.dbaccess.DBData.clearItem(DBData.java:431)
 at oracle.jdbc.dbaccess.DBDataSetImpl.clearItem(DBDataSetImpl.java:3528)
 at oracle.jdbc.driver.OraclePreparedStatement.clearParameters(OraclePreparedStatement.java:3401)
 at com.ibm.ws.rsadapter.jdbc.WSJdbcConnection.resetStatement(WSJdbcConnection.java:1719)
 at com.ibm.ws.rsadapter.jdbc.WSJdbcConnection.prepareStatement(WSJdbcConnection.java:1415)
 at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:497)
 ...

本地 Tomcat 開發環境(Tomcat 連線池)完全無法重現。

排查歷程

  1. 懷疑自身程式碼變數未初始化,反覆檢視無果。
  2. Google 關鍵字 oracle.jdbc.dbaccess.DBDataSetImpl.clearItem 發現 Hibernate 論壇多篇相似討論。
  3. 嘗試方案:
    ① 更換 Oracle 驅動(ojdbc14.jar、class12.jar、ojdbc.jar)無效。
    ② 變更 Hibernate 方言 OracleDialect → Oracle9Dialect 無效(資料庫為 8.0.5)。
    ③ 發現 ITPub 論壇貼文直指 WAS 資料源 **Statement Cache (Command Cache)** 設定。

根本原因與解決方案

**WAS 資料源屬性「語句高速緩存大小」(Statement Cache Size) 預設大於 0,導致 PreparedStatement 快取與 Oracle 驅動互動時發生 NPE。**

解決步驟

  1. 打開 WAS 管理主控台。
  2. 定位至對應資料源 (JDBC Provider → Data Source)。
  3. 找到 **Statement Cache Size** 或 **Command Cache** 參數。
  4. 將值設為 **0**(關閉 Statement 快取)。
  5. **重啟 WAS** 使設定生效。

其他連線池產品對應設定

  • C3P0:hibernate.c3p0.max_statements = 0
  • DBCP:maxPreparedStatements = 0 (或 poolPreparedStatements=false)
  • Proxool:maximum-active-statements=0

效能影響與後續觀察

關閉 Statement 快取會增加 PreparedStatement 建立開銷,但換取穩定性。生產環境運行一段時間後未再發生該異常。若效能成為瓶頸,可考慮升級 Oracle 驅動至 10g+ 版本或調整 WAS 修補包版本。

關鍵教訓

遇到無法在開發環境重現的應用伺服器特有錯誤,**優先搜尋中間件與驅動程式的已知問題**,而非盲目檢查業務邏輯代碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved