Java 通过Spring JDBC传输数据,长度未知

Java 通过Spring JDBC传输数据,长度未知,java,spring,jdbc,Java,Spring,Jdbc,我目前有一个应用程序,它通过使用SpringJDBC[SqlLobValue]将byte[]插入数据库。问题是,这不是一种可伸缩的数据接收方式,因为服务器在写入数据库之前会缓冲内存中的所有数据。我想从HttpServletRequest Inputstream流式传输数据,但是我能找到的任何以Inputstream为参数的类的所有构造函数也需要将内容长度作为参数。我不会也不会要求用户在向我的应用程序发布数据时知道内容长度。有办法绕过这个限制吗 我找不到关于内容长度超过-1会发生什么的文档,但我猜

我目前有一个应用程序,它通过使用SpringJDBC[SqlLobValue]将byte[]插入数据库。问题是,这不是一种可伸缩的数据接收方式,因为服务器在写入数据库之前会缓冲内存中的所有数据。我想从HttpServletRequest Inputstream流式传输数据,但是我能找到的任何以Inputstream为参数的类的所有构造函数也需要将内容长度作为参数。我不会也不会要求用户在向我的应用程序发布数据时知道内容长度。有办法绕过这个限制吗

我找不到关于内容长度超过-1会发生什么的文档,但我猜它会引发异常。我不知道为什么他们不能让流继续读取,直到读取(…)返回-1,这是InputStream所需的行为。

我想你的意思是“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 }
);

非常感谢——这似乎起到了作用。我确实必须将Oracle JAR升级到ojdbc6.JAR,似乎setBinaryStream(…)方法w/o length参数是在Java 6中添加的。旧的Oracle驱动程序会抛出AbstractMethodException。