[说明:这篇文章四天前已经在chinajavaworld,cn-java论坛上发表过,当时因为好像javaren上不去,只好仍到其他地方了。这几天又不再北京,没有上网,今天才得以发出来] 现在才发觉,原来 getBLOB is not supported by the Weblogic JDBC Drivers 。这几天在操纵oracle的CLOB字段时候,使用连接池所报的错误。 使用直接连接的情况下,oracle.jdbc.OracleResultSet ors = (oracle.jdbc.OracleResultSet)rs 是可以正常转换的。 在使用连接池,数据库连接池的数据库驱动采用Oracle thin driver (oracle.jdbc.driver.OracleDriver)用实际上连接池内部是涉及到weblogic jdbc driver的)。这个时候,就会报: java.io.Exception :weblogic.jdbc.rmi.SerialResultSet java.lang.ClassCastException: weblogic.jdbc.rmi.SerialResultSet 如果再细化追踪错误,会报出 SQLException :getBLOB is not supported by the Weblogic JDBC Drivers java.sql.SQLException: getBLOB is not supported by the Weblogic JDBC Drivers at weblogic.jdbc.vendor.oracle.OracleUtils.createUnsupportedException(OracleUtils.java:40) at weblogic.jdbc.rmi.SerialResultSet.getBLOB(SerialResultSet.java:1603) 这样,在操纵oracle的BLOB/CLOB类型数据的时候(主要是添加和更新,如果仅仅是读取,那么只需要一般的java.sql.Statement和java.sql.ResultSet.getBlob()就可以读取),就需要使用weblogic.jdbc.vendor.oracle.OracleThinBlob和weblogic.jdbc.vendor.oracle.OracleThinClob类。 例如下面的一段代码,未使用weblogic连接池情况下,是可以这样操作的(往oracle数据中增加一条BLOB类型数据)
// stmt是java.sql.Statement对象 // tmpbyte是byte数组 // 代码仅供参考 String sqlstr = "select blob_code form testtable where blob_key=1 for update "; oracle.sql.OracleResultSet ors = (oracle.sql.OracleResultSet)stmt.executeQuery(sqlstr); oracle.sql.BLOB blob = RS_forms.getBLOB("blob_code"); OutputStream os = blob.getBinaryOutputStream(); os.write(tmpbyte); os.close(); stmt.close();但是如果,将这段程序移植到使用weblogic连接池获取connection对象中,就会报错:java.lang.ClassCastException: weblogic.jdbc.rmi.SerialResultSet。出错的地方就是在 (oracle.sql.OracleResultSet)stmt.executeQuery(sqlstr)这段代码。 所以,以上代码,需要改成如下(部分省略),可能够适用连接池的情况: String sqlstr = "select blob_code form testtable where blob_key=1 for update "; java.sql.ResultSet rs = stmt.executeQuery(sqlstr); java.sql.Blob blob = rs.getBlob("blob_code"); OutputStream os = ((weblogic.jdbc.vendor.oracle.OracleThinBlob)blob).getBinaryOutputStream(); os.write(tmpbyte); os.close(); rs.close(); stmt.close(); ============================>>>>> /** * Author : zhaobing , 银狐999 * Date : 2002月8月9日 * 说明:此问题的最初发现和解决者,是 zhaobing ,特此感谢。 * 如有什么疑问,请留言,或发邮件:[email protected] */ 原来两年前就有人解决了,谢谢这位菜农兄,也谢谢楼上的兄弟关注! 谢谢!
[说明:这篇文章四天前已经在chinajavaworld,cn-java论坛上发表过,当时因为好像javaren上不去,只好仍到其他地方了。这几天又不再北京,没有上网,今天才得以发出来] 现在才发觉,原来 getBLOB is not supported by the Weblogic JDBC Drivers 。这几天在操纵oracle的CLOB字段时候,使用连接池所报的错误。 使用直接连接的情况下,oracle.jdbc.OracleResultSet ors = (oracle.jdbc.OracleResultSet)rs 是可以正常转换的。
在使用连接池,数据库连接池的数据库驱动采用Oracle thin driver (oracle.jdbc.driver.OracleDriver)用实际上连接池内部是涉及到weblogic jdbc driver的)。这个时候,就会报:
java.io.Exception :weblogic.jdbc.rmi.SerialResultSet
java.lang.ClassCastException: weblogic.jdbc.rmi.SerialResultSet
如果再细化追踪错误,会报出
SQLException :getBLOB is not supported by the Weblogic JDBC Drivers
java.sql.SQLException: getBLOB is not supported by the Weblogic JDBC Drivers
at weblogic.jdbc.vendor.oracle.OracleUtils.createUnsupportedException(OracleUtils.java:40)
at weblogic.jdbc.rmi.SerialResultSet.getBLOB(SerialResultSet.java:1603) 这样,在操纵oracle的BLOB/CLOB类型数据的时候(主要是添加和更新,如果仅仅是读取,那么只需要一般的java.sql.Statement和java.sql.ResultSet.getBlob()就可以读取),就需要使用weblogic.jdbc.vendor.oracle.OracleThinBlob和weblogic.jdbc.vendor.oracle.OracleThinClob类。
例如下面的一段代码,未使用weblogic连接池情况下,是可以这样操作的(往oracle数据中增加一条BLOB类型数据)
// stmt是java.sql.Statement对象
// tmpbyte是byte数组
// 代码仅供参考
String sqlstr = "select blob_code form testtable where blob_key=1 for update ";
oracle.sql.OracleResultSet ors = (oracle.sql.OracleResultSet)stmt.executeQuery(sqlstr);
oracle.sql.BLOB blob = RS_forms.getBLOB("blob_code");
OutputStream os = blob.getBinaryOutputStream();
os.write(tmpbyte);
os.close();
stmt.close();但是如果,将这段程序移植到使用weblogic连接池获取connection对象中,就会报错:java.lang.ClassCastException: weblogic.jdbc.rmi.SerialResultSet。出错的地方就是在
(oracle.sql.OracleResultSet)stmt.executeQuery(sqlstr)这段代码。
所以,以上代码,需要改成如下(部分省略),可能够适用连接池的情况: String sqlstr = "select blob_code form testtable where blob_key=1 for update ";
java.sql.ResultSet rs = stmt.executeQuery(sqlstr);
java.sql.Blob blob = rs.getBlob("blob_code");
OutputStream os = ((weblogic.jdbc.vendor.oracle.OracleThinBlob)blob).getBinaryOutputStream();
os.write(tmpbyte);
os.close();
rs.close();
stmt.close();
============================>>>>>
/**
* Author : zhaobing , 银狐999
* Date : 2002月8月9日
* 说明:此问题的最初发现和解决者,是 zhaobing ,特此感谢。
* 如有什么疑问,请留言,或发邮件:[email protected]
*/
原来两年前就有人解决了,谢谢这位菜农兄,也谢谢楼上的兄弟关注!
谢谢!