Alrighty,我一直在敲打我的头就这一个了一会儿墙,所以这里去...上传大文本文件到DB2 CLOB场
我目前正在写一个Java( 1.5)程序,该程序可以将非常大(200MB +)的文本文件上载到DB2 CLOB列,但遇到了一些问题。
在我的研究中,几个代码示例建议我使用PreparedStatement方法setCharacterStream()
将数据上传到CLOB场,给我这样的事情:
PreparedStatement preparedStatement =
connection.prepareStatement("INSERT INTO BOOKCOVERS VALUES(?,?)");
File imageFile = new File("c:\\redbookcover.jpg");
InputStream inputStream = new FileInputStream(imageFile);
preparedStatement.setString(1," 0738425826");
preparedStatement.setBinaryStream(2,inputStream,(int)(imageFile.length()));
preparedStatement.executeUpdate();
这是很好,除了一个事实,即setCharacterStream()
方法需要LENGTH值,指定要写入字段的字符数。考虑到这一点,这将可以写入CLOB字段的字符数限制为Integer.MAX_VALUE
。做一点数学计算,这将限制我可以上传到524288字节的文本文件的大小,或大约一兆字节的大小。由于CLOB字段可以存储高达2GB的数据,所以我有点困惑。
我看到在Java 1.6中,PreparedStatement的setCharacterStream()
方法已被修改为不需要长度,并且会一直读取,直到遇到文件结束为止。不幸的是,我需要使用Java 1.5,所以这不是一个有效的选项。
在研究一个最后一点,我读了Java 1.5中的PreparedStatement的具有类似的功能,其中的Javadoc声称:
” ......它可能是更实用的通过发送 它java.io.Reader对象。 数据将从流中读取为 ,直到达到文件结束。
如果存在,为什么setCharacterStream()
方法仍然需要长度参数?你会传入什么长度参数来使用这个功能?有没有更好的方法来做到这一点,我错过了?
有什么想法?
您为什么认为Integer.MAX_VALUE是524288?它是2GB-1(2^32-1) – 2010-11-16 00:43:14
我认为你的数学有点不合适。 Integer.MAX_VALUE = 2147483647 – 2010-11-16 00:49:28
我的意思是2^31-1 :-) – 2010-11-16 00:58:29