将Blob从Java存储到BD:数据大小大于此类型的最大大小,但显然不是

将Blob从Java存储到BD:数据大小大于此类型的最大大小,但显然不是,java,oracle,jakarta-ee,oracle11g,blob,Java,Oracle,Jakarta Ee,Oracle11g,Blob,好了,我们开始 我试图调用一个存储过程(PL/SQL),其中一个参数是blob,但当我执行OracleCallableStatement时,我得到以下错误: java.sql.SQLException:此类型的数据大小大于最大大小 那太令人沮丧了 我试着做了以下事情,但失败了 oracleCallableStatement.setBinaryStream(3, new ByteArrayInputStream(someByteArray), someByteArray.length); 我得到

好了,我们开始

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

java.sql.SQLException:此类型的数据大小大于最大大小

那太令人沮丧了

我试着做了以下事情,但失败了

oracleCallableStatement.setBinaryStream(3, new ByteArrayInputStream(someByteArray), someByteArray.length);
我得到了与以下相同的错误:

oracleCallableStatement.setBytes(3, someByteArray);
我还更改了oracle驱动程序,因为我阅读了如下网页:

说有个bug,我把它更新到了ojdbc5.jar 发件人:

但问题依然存在

DB是一个Oracle 11g JavaEE是在Glassfish 2.1中运行的1.5

嗯,我想就是这样,我的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)
编辑

那么,再一次你好,把这个放在这里。。。如果我做错了,告诉我,我会删除它

someByteArray是从someString.toByteArray()获取的数组

该字符串包含一个(编辑:用于表示jpeg)PNG图像的表示,该图像以Base64编码

所以,我在sun.misc.base64解码器中使用了一个方法从someString中获取someByteArray。。。 然后我用

oracleCallableStatement.setBinaryStream(3, new ByteArrayInputStream(someByteArray), someByteArray.length);
它就像一个符咒

布乌特。。。 不建议使用sun.misc中的类,有关详细信息,请阅读本文

但是

这并不能解决为什么我无法将第一个字节数组放入参数中的谜团,以及神秘异常“java.sql.SQLException:Data size大于此类型的max size”的谜团

编辑:

这个错误再次出现。。。这次一切正常,我正确地解码了base64,但是“java.sql.SQLException:数据大小大于此类型的最大大小”不断返回

编辑:

是驱动程序,我在服务器和应用程序上更改了驱动程序,然后重新部署,一切正常…

不是答案

不能(正确地)将图像的字节保留在字符串中。您可以首先使用Base64将
字节[]
编码为字符串。也许我误解了,你做得对。检查您是否记录了每个异常

除了不推荐使用的sun版本(并非每个JDK都提供)之外,还有其他一些Base64转换。在JavaEE中:

import javax.xml.bind.DatatypeConverter;
String data = "...";
byte[] bytes = DatatypeConverter.parseBase64Binary(data);
String data = DatatypeConverter.parseBase64Binary(bytes);
你不能在没有base64编码的情况下将数据存储为二进制blob吗?这样至少可以节省空间


另一个错误可能会被Tearray或其他一些小错误重复使用。

结果是驱动程序,我在问题中提到,我改为了ojdbc5.jar,我必须确保web服务器选择了正确的错误,而不是Alex Poole指出的旧错误,问题解决了。

这看起来也是一个或多或少的常见错误:您确定Glassfish正在使用更新的驱动程序吗?它没有优先使用的旧驱动程序?是的,我仔细检查了。此外,异常在执行之前触发,在我设置参数时触发,我要编辑我的帖子…@AlexPoole你是对的。。。Glassfish实际上是在使用旧的驱动程序…我编辑了我的帖子,它是一个PNG图像而不是jpeg,并且,我正在将它从base64正确解码到字节数组…啊,图像是在base64中交付的(就像表单上载)。因此,我的回答没有那么有用。是否给出了长度<代码>水滴(102400)?虽然4GB是最大值,但我认为默认值是2GB。