В одном из рассматриваемых мной классов Java я вижу следующий код
private oracle.sql.CLOB getCLOB() {
oracle.sql.CLOB xmlDocument = null;
CallableStatement cstmt = null;
ResultSet resultSet = null;
Connection connection = null;
try {
connection = Persistence.getConnection();
cstmt = connection.prepareCall("{call pkg.proc(?,?)}");
cstmt.registerOutParameter(1, OracleTypes.CURSOR);
cstmt.setString(2, id);
cstmt.execute();
resultSet = (ResultSet)cstmt.getObject(1);
if (resultSet.next()) {
xmlDocument = ((OracleResultSet) resultSet).getCLOB(1);
}
} finally {
Persistence.closeAll(resultSet, cstmt, connection);
}
return xmlDocument;
}
oracle.sql.CLOB, возвращаемый getCLOB (), читается другим методом:
private void anotherMethod() {
...
oracle.sql.CLOB xmlDocument = getCLOB();
clobLength = xmlDocument.length();
chunkSize = xmlDocument.getChunkSize();
textBuffer = new char[chunkSize];
for (int position = 1; position <= clobLength; position += chunkSize) {
charsRead = xmlDocument.getChars(position, chunkSize, textBuffer);
outputBufferedWriter.write(textBuffer, 0, charsRead);
}
...
}
Я новичок в этом проекте, и люди здесь говорят, что этот код работает. Я не понимаю, как мы можем прочитать CLOB (который, на мой взгляд, является справочным) после закрытия основного соединения с базой данных. Чего мне не хватает?
РЕДАКТИРОВАТЬ: еще один момент, который стоит отметить, что этот код работает на сервере приложений. Persistence.getConnection () получает соединение из источника данных (наиболее вероятно с пулом соединений). Интересно, используется ли соединение с базой данных после его возвращения в пул соединений?
EDIT2: использование соединения после его возврата в пул может не являться причиной. Сервер приложений - сервер Oracle Glassfish Websphere , и я надеюсь, что они защитят от такого использования.