0
我有5k个字符可以从oracle数据库的每一行读取为CLOB作为选择列表查询。在使用springjdbc执行查询之后,在尝试将CLOB对象转换为String时抛出下面的异常。在读取clob对象时弹簧jdbc模板连接关闭异常
public List<MasterData> findByRqstId(int rqstId) {
String sql = "SELECT * FROM MASTER_DATA WHERE REQUEST_ID = ?";
List<MasterData> masterDataList = getSimpleJdbcTemplate().query(sql,
ParameterizedBeanPropertyRowMapper.newInstance(MasterData.class), rqstId);
return masterDataList;
}
Caller Code
masterDataList = masterDataDao.findByRqstId(rqstId);
String outputResponse=null;
if (masterDataList != null && masterDataList.size() > 0) {
for (MasterData mData : masterDataList) {
Clob clob = mData.getOutputResponse();
InputStream in = clob.getAsciiStream();
StringWriter w = new StringWriter();
IOUtils.copy(in, w);
String clobAsString = w.toString();
outputResponse = clob.toString();
}
}
我能够得到clob对象。但是当我尝试使用上面的代码将对象转换为字符串时,我得到连接关闭异常。
Exception in thread "main" java.sql.SQLRecoverableException: Close Connection
at oracle.sql.CLOB.getDBAccess(CLOB.java:1421)
at oracle.sql.CLOB.getAsciiStream(CLOB.java:352)
据我所知,由于clob对象的大小较大,缓存无法为下一个操作保存数据。以下属性没有区别。
<property name="connectionProperties" value="defaultRowPrefetch=1000" />
<property name="connectionProperties" value="defaultLobPrefetchSize=500000" />
问题是,当你访问clob时,产生它的连接已经关闭。您应该在传递给JDBC模板的映射器中执行此操作。附注:你确定你需要使用'getAsciiStream'而不是'getCharacterStream'吗? –