从Oracle列读取BLOB虽然试图从像下面码的BLOB获得的InputStream读取被阻断,InputStream的进入不定等待状态。InputStream读入,同时通过JDBC
我从Jboss的应用服务器上运行的Web应用程序设置此数据和读/写的作品精绝,问题是在使用普通的JDBC运行独立的Java代码。
环境是JDK6,Oracle 10g中。
ResultSet rs = this.stmt.executeQuery();
log.println("ResultSetType: " + (rs != null ? rs.getClass() : null));
while (rs != null && rs.next()) {
. . . // read other columns
Blob savedBlob = rs.getBlob("PERSISTENCE_BLOB");
long len = savedBlob.length();
log.println("Going to read bytes..." + len);
InputStream is = savedBlob.getBinaryStream();
log.println("IS Received...");
log.println("Available : " + is.available());
ObjectInputStream oip = new ObjectInputStream(is);
Object obj = oip.readObject();
oip.close();
is.close();
savedBlob.free();
. . .
输出是如下...
ResultSetType: class oracle.jdbc.driver.OracleResultSetImpl
RowID: XXXXXXXXXXXXXXX // Row is selected and printed properly
Going to read bytes...6022
IS Received...
Available : 0
但如果我尝试在卡盘如下读..它工作得很好,这是我不希望因为我读序列化对象并想从InputStream中打开ObjectInputStream。
. . .
ResultSet rs = this.stmt.executeQuery();
log.println("ResultSetType: " + (rs != null ? rs.getClass() : null));
while (rs != null && rs.next()) {
. . .
Blob savedBlob = rs.getBlob("PERSISTENCE_BLOB");
long len = savedBlob.length();
int start = 1;
int totalBytesRead = 0;
int buffSize = 2048;
byte[] byteBuff = null;
log.println("Going to read bytes..." + len);
do {
byteBuff = new byte[buffSize];
byteBuff = savedBlob.getBytes(start, buffSize);
totalBytesRead += buffSize;
log.println(start + "," + buffSize + " #BLOB bytes: " + new String(byteBuff));
start += buffSize;
. . .
} while (. . .);
log.println("Total Bytes: " + totalBytesRead);
输出:
ResultSetType: class oracle.jdbc.driver.OracleResultSetImpl
Going to read bytes...6022
1,2048 #BLOB bytes: //......bytes data..........
.....
Total Bytes: 6022
感谢马克,但我想使用的InputStream而不是字节块读取。正如我在Jboss中提到相同的代码,但在独立的Java应用程序中使用JDBC时没有提到。 – JMewada
您应该能够使用'InputStream'就好了,这是我的观点。否则,你真的需要演示InputStream是如何失败的,因为你的文章中没有任何内容实际上表明它失败了,只是误解了'available()'的含义。 –
好的。所以当我从Eclipse运行应用程序作为Java应用程序或从命令行运行它时,它只是挂在那里,在可用的最后一个日志行之后什么都不做......我必须手动终止它。 – JMewada