У меня есть 5k + символов для чтения из каждой строки в Oracle Oracle как CLOB для запроса списка выбора. После выполнения запроса, используя springjdbc, при попытке конвертировать объект CLOB в String исключается нижеследующее исключение.Spring jdbc template connection закрытое исключение при чтении объекта clob
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'? –