Как я понимаю поток можно прочитать
только один раз.
Да
Так что мне нужно хранить все изображение в
память
Возможно, но не обязательно. Посмотрите на setBinaryStream метод PreparedStatement . При некоторых условиях вы могли бы просто передать свой поток ввода этому методу. Посмотрите на какой-нибудь другой потоковый метод, ваш драйвер JDBC может поддерживать только их подмножество.
С некоторой умной буферизацией вы можете, вероятно, обслуживать исходный поток и измененное изображение также за один вызов.
Это дорого по производительности?
О каком спектакле вы говорите. Если память ограничена, это, конечно, будет иметь значение. В противном случае память ввода-вывода является наименее вероятным местом, чтобы стать узким местом.
Если у вас достаточно памяти, я бы порекомендовал вам воспользоваться этим подходом, поскольку реализация наиболее проста и память дешева.
Или есть другой способ?
Как я уже говорил, вы можете создать умную технику буферизации, но это требует большого тестирования (и проектирования). Если память ограничена, вам, возможно, придется вернуться к этому подходу, в противном случае просто прочитайте весь поток, обработайте его и запишите результат в БД.