mysql - java.sql.Clob 读取 : weird results b/w MySQL and Oracle

标签 mysql oracle jdbc

我获得了用于读取/写入大文本的统一 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 驱动程序 11.2.0.2) 上给出零。幸运的是,Clob.length()在两者上都给出了正确的值,并且InputStream.read()最多-1也可以工作,因此还有其他方法可以统一获取数据.

Javadoc gives这个奇怪的注释:

The available method for class InputStream always returns 0.

那么哪个驱动程序是正确的?不,我不想将特定于供应商的包拖到代码中:-) 这个问题与 JDBC 无关。

最佳答案

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

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

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

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

关于mysql - java.sql.Clob 读取 : weird results b/w MySQL and Oracle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12592107/

相关文章:

php - 为什么我从连接表中得到错误的值?

php - 使用 PHP 在新站点上显示来自 MySQL 的记录?

mysql - 使用 Pentaho 将数据从 SQL/Oracle 迁移到 Cassandra

java - 内部异常 : com. mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:未知错误 1049

c# - 尝试连接到远程地址数据库时出现超时错误

mysql - CentOS7 : MariaDB update - Failed to start

oracle - hibernate 和 ORA-01400 : cannot insert NULL

sql - 使用 group by 进行选择查询

oracle - oracle DATE 和 TIMESTAMP 的区别

jdbc - Eclipse rcp - 如何加载 jdbc 驱动程序?