好吧,我已经把我的头撞在墙上一段时间了,所以就这样吧……
我目前正在编写一个 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()
方法仍然需要长度参数?你会为长度参数传递什么来使用这个功能?有没有更好的方法来做到这一点,我错过了?
有什么想法吗?