将大型文本文件上载到DB2 CLOB字段中

时间:2010-11-16 00:29:50

标签: java jdbc db2 blob 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()方法仍需要长度参数?你会传递什么长度参数来使用这个功能?有没有更好的方法来做到这一点,我错过了?

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

正如您所指出的,setCharacterStream的1.5规范对于它是读取到文件结尾还是达到长度是不明确的。

  

将指定参数设置为   给定Reader对象,即   给定的字符数很长。什么时候   输入一个非常大的UNICODE值   一个LONGVARCHAR参数,它可能是   通过一个更实用的发送它   java.io.Reader对象。数据会   根据需要从流中读取   直到达到文件结尾。 JDBC   司机会做任何必要的   从UNICODE转换为   数据库字符格式。

如果您将Integer.MAX_VALUE作为length参数传递,它可能会像您想要的那样工作。试一试,看看会发生什么。