Потоковая передача данных через Spring JDBC, неизвестная длина - PullRequest
4 голосов
/ 22 апреля 2009

В настоящее время у меня есть приложение, которое вставляет byte [] в нашу БД с помощью Spring JDBC [SqlLobValue]. Проблема в том, что это не масштабируемый способ получения данных, поскольку сервер буферизует все данные в памяти перед записью в базу данных. Я хотел бы передавать данные из HttpServletRequest Inputstream, но все конструкторы, которые я могу найти для любых классов, которые принимают Inputstream в качестве аргумента, также требуют длину содержимого в качестве аргумента. Я не требую и не буду требовать, чтобы пользователь знал длину содержимого при размещении данных в моем приложении. Есть ли способ обойти это ограничение?

Я не могу найти документацию о том, что произойдет, если я передам -1 для длины контента, но я предполагаю, что это вызовет исключение. Я не уверен, почему они не могли просто читать поток до тех пор, пока read (...) не вернет -1, необходимое поведение InputStream.

1 Ответ

8 голосов
/ 22 апреля 2009

Полагаю, вы имели в виду «InputStream», а не «OutputStream». Я попробовал это, но у меня были большие проблемы с моим драйвером JDBC, поэтому я не уверен, действительно ли это работает.

InputStream inputStream = httpServletRequest.getInputStream();

int contentLength = -1; // fake, will be ignored anyway
SqlLobValue sqlLobValue = new SqlLobValue(
    inputStream,
    contentLength,
    new DefaultLobHandler() {
        public LobCreator getLobCreator() {
            return new DefaultLobHandler.DefaultLobCreator() {
                public void setBlobAsBinaryStream(PreparedStatement ps, int paramIndex, InputStream binaryStream, int contentLength) throws SQLException {
                    // The contentLength parameter should be the -1 we provided earlier.
                    // You now have direct access to the PreparedStatement.
                    // Simply avoid calling setBinaryStream(int, InputStream, int)
                    // in favor of setBinaryStream(int, InputStream).
                    ps.setBinaryStream(paramIndex, binaryStream);
                }
            };
        }
    }
);

jdbcTemplate.update(
    "INSERT INTO foo (bar) VALUES (?)",
    new Object[]{ sqlLobValue }
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...