2010-11-16 49 views
1

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

有什么想法?

+0

您为什么认为Integer.MAX_VALUE是524288?它是2GB-1(2^32-1) – 2010-11-16 00:43:14

+0

我认为你的数学有点不合适。 Integer.MAX_VALUE = 2147483647 – 2010-11-16 00:49:28

+0

我的意思是2^31-1 :-) – 2010-11-16 00:58:29

回答

0

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

将指定参数设置到 定Reader对象,该对象是字符 给定数量的长。当 一个非常大的UNICODE值输入到 一个LONGVARCHAR参数,它可能是 更实际发送它通过一个 java.io.Reader对象。根据需要从数据流中读取数据 ,直到达到文件结尾。 JDBC 驱动程序将执行任何必需的 从UNICODE转换为 数据库字符格式。

如果您通过Integer.MAX_VALUE作为长度参数,它可能会像您想要的那样工作。尝试一下,看看会发生什么。

+0

我试着指定Integer.MAX_VALUE,但最终得到一个IndexOutOfBoundsException。当我使用-1和0时,只是没有写任何东西而发生了同样的情况。这些是我想象得到的唯一值,可以用来发信号来读取缓冲区,直到它为空。 – Ampp3 2010-11-16 16:42:35