0

我得到了一个用于读/写大文本的统一 JDBC 代码。列是 Oracle 上的 CLOB 和 MySQL 上的 TEXT。以下代码

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 driver 11.2.0.2) 上给出零。Clob.length()幸运的是,两者都给出了正确的值,InputStream.read()最多 -1 的作品也有,所以还有其他方法可以统一获取数据。

Javadoc 给出了这个奇怪的注释:

InputStream 类的可用方法总是返回 0。

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

4

1 回答 1

2

我很想说两位司机都是对的。

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

我猜 Oracle 驱动程序CLOB在执行查询后不会立即缓存任何数据,所以这可能是该available()方法返回 0 的原因。但是,一旦从流中读取数据,available()Oracle 驱动程序的方法就不会更长的返回 0,因为似乎 Oracle JDBC 驱动程序已进入数据库并从CLOB列中提取了一些数据。另一方面,一旦查询完成执行,MySQL 似乎更主动地从 TEXT 列中实际提取数据。

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

于 2012-09-26T14:28:17.243 回答