存储从Java中的一滴到BD:数据大小比为这种类型的最大尺寸更大的显然不是时候(Store a Bl

2019-10-17 16:58发布

好了,我们开始吧...

我试图调用存储过程(PL / SQL),其中一个参数是一个blob,但是当我执行OracleCallableStatement我得到这个错误:

值java.sql.SQLException:数据大小比为这种类型的最大尺寸更大

这是哦,这么感慨万分..

我曾尝试做以下和失败......

oracleCallableStatement.setBinaryStream(3, new ByteArrayInputStream(someByteArray), someByteArray.length);

我得到同样的错误有:

oracleCallableStatement.setBytes(3, someByteArray);

我也改变了Oracle驱动程序,因为我看过这样的网页:

http://www.coderanch.com/t/457770/JDBC/databases/java-sql-sqlexception-data-size

说有一个错误,我更新了它ojdbc5.jar来源: http://www.oracle.com/technetwork/database/enterprise-edition/jdbc-112010-090769.html

但问题仍然存在

该数据库是一个的Oracle 11g的JavaEE 1.5在2.1的Glassfish运行

好吧,我想就是这样了,我someByteArray不大于4GB的! 它具有38678的长度

编辑:异常之前发射的执行..当我设置属性为OracleCallableStatement它触发

堆栈跟踪的一部分:

at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:179)
at oracle.jdbc.ttc7.TTCItem.setArrayData(TTCItem.java:103)
at oracle.jdbc.dbaccess.DBDataSetImpl.setBytesBindItem(DBDataSetImpl.java:2484)
at oracle.jdbc.driver.OraclePreparedStatement.setItem(OraclePreparedStatement.java:1224)
at oracle.jdbc.driver.OraclePreparedStatement.setBinaryStream(OraclePreparedStatement.java:2710)

编辑

所以,大家好,要在这里把这个......告诉我,如果I'm做错了,我会删除它...

someByteArray是一个阵列,这是从获得someString.toByteArray()

该字符串正拿着的表示(编辑:常说JPEG)以Base64 PNG图像编码...

所以,我用sun.misc.BASE64Decoder的方法从someString获得someByteArray ......然后我用

oracleCallableStatement.setBinaryStream(3, new ByteArrayInputStream(someByteArray), someByteArray.length);

和它的工作就像一个魅力..

BUUUT ......在sun.misc类的用法是不推荐,阅读以获取更多信息..

工作sun.misc.BASE64Encoder /解码器用于获取字节[]

但!!!

不解开这个谜,为什么我无法把第一个字节数组的参数和神秘异常的谜“值java.sql.SQLException:数据大小比为这种类型的最大规模更大的” ...

编辑:

这个错误又出现了......这个时候一切都还好,我是正确解码的base64,但“值java.sql.SQLException:数据大小比为这种类型的最大规模更大的”保留返回...

编辑:

正是那个司机,我改变它的服务器和应用程序,并重新部署我,一切都工作得很好...

Answer 1:

没有答案

你不能保持图像的字节字符串(正确)。 你可以先编码byte[]使用Base64编码为一个字符串。 也许尽管我误解,你正确地做到了。 检查你做记录每一个例外。

还有除了弃用Sun的版本一些其他的Base64转换(这是不是酒店的每JDK)。 在JavaEE的:

import javax.xml.bind.DatatypeConverter;
String data = "...";
byte[] bytes = DatatypeConverter.parseBase64Binary(data);
String data = DatatypeConverter.parseBase64Binary(bytes);

你不能存储数据为二进制的blob,没有base64编码? 它会至少节省空间。

一个其他错误可以重复使用日益ByteArray中的什么其他琐碎的错误。



Answer 2:

原来,这是司机,我改ojdbc5.jar正如我在我的问题说,我必须确保Web服务器选择了正确的一个,而不是旧的一个,由亚历克斯·普尔指出,而问题就解决了。



文章来源: Store a Blob from Java to BD: Data size bigger than max size for this type when is clearly not