【发布时间】:2016-02-09 07:32:51
【问题描述】:
我有 5k+ 个字符要从 oracle DB 中的每一行读取为 CLOB 用于选择列表查询。使用 springjdbc 执行查询后,尝试将 CLOB 对象转换为 String 时引发以下异常。
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?
标签: java jdbc apache-commons spring-jdbc