2009-04-22 2 views
4

私は現在、Spring [SqlLobValue]を使用してbyte []をDBに挿入するアプリケーションを持っています。問題は、サーバーがデータベースに書き込む前にすべてのデータをバッファリングしているため、これはスケーラブルな方法ではないということです。私は、HttpServletRequest Inputstreamからデータをストリーミングしたいと思いますが、Inputstreamを引数として取るクラスのすべてのコンストラクタも、引数としてコンテンツの長さを必要とします。私は、アプリケーションにデータをポストするときに、ユーザーがコンテンツの長さを知っている必要はありません。この制限を回避する方法はありますか?Spring JDBCによるデータのストリーミング、未知の長さ

コンテンツの長さに-1を渡すと何が起こるのかに関するドキュメントは見つかりませんが、私の推測では例外がスローされます。読み込み(...)が-1を返すまで、ストリームが読み込みを維持できない理由がわからないのですが、InputStreamの必要な動作です。

答えて

8

「OutputStream」ではなく「InputStream」を意味するとします。私はこれを試しましたが、私は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 } 
); 
+0

非常に高く評価されています。 Oracle JARをojdbc6.jarにアップグレードする必要がありましたが、setBinaryStream(...)メソッドがJava 6にlength引数が追加されているようです。古いOracleドライバはAbstractMethodExceptionをスローします。 – Gandalf

関連する問題