将Blob从Java存储到BD:数据大小大于此类型的最大大小,但显然不是
好了,我们开始 我试图调用一个存储过程(PL/SQL),其中一个参数是blob,但当我执行OracleCallableStatement时,我得到以下错误: java.sql.SQLException:此类型的数据大小大于最大大小 那太令人沮丧了 我试着做了以下事情,但失败了将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); 我得到
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。