gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:45:34 25 4
gpt4 key购买 nike

我获得了用于读取/写入大文本的统一 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com