代码之家  ›  专栏  ›  技术社区  ›  Gandalf

通过SpringJDBC传输数据,长度未知

  •  4
  • Gandalf  · 技术社区  · 15 年前

    我目前有一个应用程序,通过使用SpringJDBC[sqllobValue]将byte[]插入到我们的数据库中。问题是,这不是一种可扩展的数据接收方式,因为服务器在写入数据库之前正在缓冲内存中的所有数据。我希望从httpservletrequest inputstream流式传输数据,但是对于任何将inputstream作为参数的类,我可以找到的所有构造函数也需要将内容长度作为参数。我不会也不会要求用户在将数据发布到我的应用程序时知道内容长度。有没有办法克服这个限制?

    我找不到关于如果我在内容长度上通过-1会发生什么的文档,但是我猜它会抛出一个异常。我不知道为什么他们不能让流一直读,直到read(…)返回-1,这是输入流所需的行为。

    1 回复  |  直到 15 年前
        1
  •  8
  •   Adam Paynter    15 年前

    我想你的意思是“输入流”而不是“输出流”。我试过了,但是我的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 }
    );