Druid連接池存儲oracle clob類型出錯處理

問題描述

Druid連接池在存儲oracle數據庫clob類型時會報如下錯誤

Caused by: java.lang.ClassCastException: com.alibaba.druid.proxy.jdbc.ClobProxyImpl cannot be cast to oracle.sql.CLOB
	at oracle.jdbc.driver.OraclePreparedStatement.setClob(OraclePreparedStatement.java:6926)
	at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_setClob(FilterChainImpl.java:3100)
	at com.alibaba.druid.filter.FilterAdapter.preparedStatement_setClob(FilterAdapter.java:1217)
	at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_setClob(FilterChainImpl.java:3097)
	at com.alibaba.druid.filter.FilterAdapter.preparedStatement_setClob(FilterAdapter.java:1217)
	at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_setClob(FilterChainImpl.java:3097)
	at com.alibaba.druid.filter.FilterAdapter.preparedStatement_setClob(FilterAdapter.java:1217)
	at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_setClob(FilterChainImpl.java:3097)
	at com.alibaba.druid.proxy.jdbc.PreparedStatementProxyImpl.setClob(PreparedStatementProxyImpl.java:328)
	at com.alibaba.druid.pool.DruidPooledPreparedStatement.setClob(DruidPooledPreparedStatement.java:614)
	... 165 more

解決方案

方法一:將數據類型改成String

Clob和String的互轉工作Druid已經幫忙做了,所以不用關心
具體看源碼(DruidLobCreator):

@Override
public void setClobAsString(PreparedStatement ps, int paramIndex, String content) throws SQLException {
    Clob clob = ps.getConnection().createClob();
    clob.setString(1, content);
    ps.setClob(paramIndex, clob);
}

方法二:將取出來的oracle.sql.CLOB類型字段轉成org.hibernate.lob.ClobImpl,然後再設置回去保存

Clob clob = entity.getContent();
Clob clob2 = new ClobImpl(ClobToString(clob));
entity.setContent(clob2);

上面兩種方法任取一種即可,推薦使用方法一

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章