應用部署於 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 連線池)完全無法重現。
oracle.jdbc.dbaccess.DBDataSetImpl.clearItem 發現 Hibernate 論壇多篇相似討論。ojdbc14.jar、class12.jar、ojdbc.jar)無效。OracleDialect → Oracle9Dialect 無效(資料庫為 8.0.5)。**WAS 資料源屬性「語句高速緩存大小」(Statement Cache Size) 預設大於 0,導致 PreparedStatement 快取與 Oracle 驅動互動時發生 NPE。**
hibernate.c3p0.max_statements = 0maxPreparedStatements = 0 (或 poolPreparedStatements=false)maximum-active-statements=0關閉 Statement 快取會增加 PreparedStatement 建立開銷,但換取穩定性。生產環境運行一段時間後未再發生該異常。若效能成為瓶頸,可考慮升級 Oracle 驅動至 10g+ 版本或調整 WAS 修補包版本。
遇到無法在開發環境重現的應用伺服器特有錯誤,**優先搜尋中間件與驅動程式的已知問題**,而非盲目檢查業務邏輯代碼。