Я полагаю, что основной поток кода выглядит следующим образом:
try {
Get connection, statement, resultset
Use connection, statement, resultset
Get inputstream of resultset
} finally {
Close resultset, statement, connection
}
try {
Get outputstream
Use inputstream of resultset, outputstream
} finally {
Close outputstream, inputstream of resultset
}
И что закрытие ResultSet
неявно закрыло InputStream
. Похоже, что ваш драйвер JDBC не сохраняет InputStream
из ResultSet
полностью в памяти или во временной памяти, когда ResultSet
закрыт. Возможно, драйвер JDBC немного упрощен или плохо продуман, или изображение слишком велико для хранения в памяти. Кто знает.
Сначала я выясню, какой драйвер / версию драйвера JDBC вы используете, а затем обратитесь к документации разработчика, чтобы узнать о настройках, которые могут изменить или исправить это поведение. Если вы все еще не можете понять это, вам придется перестроить основной поток кода следующим образом:
try {
Get connection, statement, resultset
Use connection, statement, resultset
try {
Get inputstream of resultset, outputstream
Use inputstream of resultset, outputstream
} finally {
Close outputstream, inputstream of resultset
}
} finally {
Close resultset, statement, connection
}
или
try {
Get connection, statement, resultset
Use connection, statement, resultset
Get inputstream of resultset
Copy inputstream of resultset
} finally {
Close resultset, statement, connection
}
try {
Get outputstream
Use copy of inputstream, outputstream
} finally {
Close outputstream, copy of inputstream
}
Первый подход наиболее эффективен, только код неуклюжий. Второй подход - неэффективная память при копировании в ByteArrayOutputStream
или неэффективная производительность при копировании в FileOutputStream
. Если изображения в основном маленькие и не превышают мегабайт или что-то еще, то я просто скопирую их в ByteArrayOutputStream
.
InputStream input = null;
OutputStream output = null;
try {
input = new BufferedInputStream(resultSet.getBinaryStream("columnName"), DEFAULT_BUFFER_SIZE);
output = new ByteArrayOutputStream();
byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
for (int length; ((length = input.read(buffer)) > 0;) {
output.write(buffer, 0, length);
}
} finally {
if (output != null) try { output.close(); } catch (IOException ignore) {}
if (input != null) try { input.close(); } catch (IOException ignore) {}
}
Image image = new Image();
image.setPhoto(new ByteArrayInputStream(output.toByteArray()));
// ...