好吧,我已经把头撞在这个墙上一段时间了,所以这里就是......
我目前正在编写一个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()
方法仍需要长度参数?你会传递什么长度参数来使用这个功能?有没有更好的方法来做到这一点,我错过了?
有什么想法吗?
答案 0 :(得分:0)
正如您所指出的,setCharacterStream
的1.5规范对于它是读取到文件结尾还是达到长度是不明确的。
将指定参数设置为 给定Reader对象,即 给定的字符数很长。什么时候 输入一个非常大的UNICODE值 一个LONGVARCHAR参数,它可能是 通过一个更实用的发送它 java.io.Reader对象。数据会 根据需要从流中读取 直到达到文件结尾。 JDBC 司机会做任何必要的 从UNICODE转换为 数据库字符格式。
如果您将Integer.MAX_VALUE
作为length参数传递,它可能会像您想要的那样工作。试一试,看看会发生什么。