我有一个Derby SQL数据库,其中我有一个包含需要包含序列化对象的blob字段的表。 我通过JDBC访问它。 问题是,当我使用ResultSet对对象进行反序列化时,一切正常,但如果我使用CachedRowSet,我会得到一个"数据类型不匹配"异常。
以下是有效的代码:
ResultSet rs = stmt.executeQuery();
rs.next();
byte[] buf = rs.getBytes("albero");
这是替代比特
CachedRowSet crs = null;
ResultSet rs = stmt.executeQuery();
crs = RowSetProvider.newFactory().createCachedRowSet();
crs.populate(rs);
crs.next();
byte[] buf = crs.getBytes("albero");
有谁能帮助我理解为什么这种不同的行为? 感谢
答案 0 :(得分:1)
CachedRowSet
(假设参考实现com.sun.rowset.CachedRowSetImpl
)将数据的副本存储在缓存行集中的ResultSet
中。它使用提供给getObject
的结果集的populate
方法执行此操作。
当您指示该列是blob时,我假设getObject
将返回Blob
并且元数据中的列类型为BLOB
而不是字节数组(类型{{ 1}}或VARBINARY
)。因此,缓存的行集只允许您将列检索为LONGVARBINARY
,而不是Blob
,即使原始结果集支持该列。
JDBC 4.2规范(附录B.6)描述了哪些类型支持哪些方法,而对于byte[]
,仅支持BLOB
(和getBlob
)。但是,与规范中的要求相反,许多驱动程序更宽松,并且getObject
支持getBytes
和getBinaryStream
。在这方面,BLOB
对JDBC的解释更为严格。