Как использовать MyBatis BlobInputStreamTypeHandler / ClobReaderTypeHandler для потоковой передачи содержимого запроса выбора? - PullRequest
0 голосов
/ 28 мая 2020

Мне нужно получить содержимое BLOB и где-нибудь его сохранить (допустим, это файл). Контент BLOB может быть большим, поэтому я хочу использовать для этого потоки. На странице MyBatis 'Configuration XML' находится список доступных обработчиков типов. Я обнаружил, что есть BlobInputStreamTypeHandler, который должен позволить мне получить InputStream, и это именно то, что мне нужно. Поэтому я указал resultType="java.io.InputStream" для своего запроса в конфигурации xml. Однако я получаю java.io.IOException: Closed Connection, когда пытаюсь прочитать данные из InputStream, которые у меня есть после выполнения метода «чтение из БД». Я попытался понять это и обнаружил, что класс org.apache.ibatis.executor.resultset.DefaultResultSetHandler закрывает resultSet , и это делает поток нечитаемым.

Я получаю такое же исключение, когда пытаюсь использовать ClobReaderTypeHandler для получения Reader из CLOB.

Я использую mybatis версии 3.5.4.

Как мне получить Reader / InputStream из столбца CLOB или BLOB? Это ошибка или я что-то делаю не так?

1 Ответ

0 голосов
/ 28 мая 2020

Вам нужно прочитать входной поток, пока сеанс открыт.

Предполагая, что ваш метод сопоставления объявлен следующим образом ...

@Select("select bindata from users where id = #{id}")
InputStream selectBlob(Integer id);

код, который получает и считывает ввод поток будет выглядеть примерно так.

try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
  Mapper mapper = sqlSession.getMapper(Mapper.class);
  try (InputStream inputStream = mapper.selectBlob(1)) {
    byte[] buffer = new byte[1024];
    int read;
    while((read = inputStream.read(buffer)) > -1) {
      // use the read data
    }
  }
}
...