java.sql.Clob读取:使用MySQL和Oracle的奇怪结果

java.sql.Clob读取:使用MySQL和Oracle的奇怪结果,mysql,oracle,jdbc,Mysql,Oracle,Jdbc,我有一个统一的JDBC代码来读/写大文本。列在Oracle上是CLOB,在MySQL上是文本。下面的代码 java.sql.Clob aClob = resultSet.getClob(COLUMN_NAME); java.io.InputStream aStream = aClob.getAsciiStream(); int av = aStream.available(); 在MySQL(Connector/J 5.0.4)上给出了相关值,但在Oracle(Oracle JDBC驱动程序1

我有一个统一的JDBC代码来读/写大文本。列在Oracle上是CLOB,在MySQL上是文本。下面的代码

java.sql.Clob aClob = resultSet.getClob(COLUMN_NAME);
java.io.InputStream aStream = aClob.getAsciiStream();
int av = aStream.available();
在MySQL(Connector/J 5.0.4)上给出了相关值,但在Oracle(Oracle JDBC驱动程序11.2.0.2)上为零
Clob.length()
幸运的是,在这两个方面都给出了正确的值,
InputStream.read()
高达-1也可以工作,因此有其他方法可以统一获取数据

这个奇怪的音符:

类InputStream的可用方法始终返回0


那么哪个司机是对的呢?不,我不想将特定于供应商的软件包拖到代码中:-)这个问题与JDBC无关。

我想说这两个驱动程序都是正确的

available()
方法的Javadoc似乎表明返回的值是对InputStream当前缓存了多少字节的估计,并且可以在不进行I/O操作的情况下返回给您。它缓存了多少字节,以及它如何进行任何缓存,在我看来都是一个实现细节。这些值不同的事实仅仅表明这两个驱动程序的实现方式不同。
available()
方法的Javadoc中没有任何内容向我表明任何一个驱动程序做错了什么

我猜Oracle驱动程序在执行查询后不会立即缓存
CLOB
中的任何数据,因此
available()
方法可能会返回0。但是,一旦从流中读取了数据,Oracle驱动程序的
available()
方法就不再返回0,因为Oracle JDBC驱动程序似乎已经访问了数据库并从
CLOB
列中提取了一些数据。另一方面,MySQL似乎更主动地在查询完成后立即从文本列中提取数据


在阅读了Javadoc中的
available()
方法之后,我不确定为什么要使用它。你用它干什么?

我读得越多,它就越有意义。预期用途是一个循环,读取一个字节直到可用为零。我没想到它在第一次呼叫时返回零。但我猜javadoc中的关键词是“阻塞”。这意味着在Oracle上读取第一个字节要比在MySQL上花费更多的时间。嗯,我已经用不同的方式做了。