for (int j = 0; j < countPerBatch; j++) {
                    stmt.setInt(1, 0);
                    CLOB clob = new CLOB((OracleConnection) conn, PicManager.GetImageStr(picList.get(i + j)));
                    stmt.setClob(2, clob);
                    stmt.addBatch();
                    PicManager.setCurrentPicNo(i + j);
                }
                stmt.executeBatch();执行到stmt.executeBatch()报错,为何?
解释一下代码:
这是一个保存大量照片到数据库的文件,PicManager.GetImageStr(picList.get(i + j))这个方法是把照片文件用base64转码成byte数组,最后new clob()是用来构造一个oracle.sql.CLOB对象,为何会报错?具体错误信息如下:Exception in thread "Thread-3" java.lang.ArrayIndexOutOfBoundsException
        at java.lang.System.arraycopy(Native Method)
        at oracle.jdbc.driver.DatumBinder.bind(OraclePreparedStatement.java:15933)
        at oracle.jdbc.driver.OraclePreparedStatement.setupBindBuffers(OraclePreparedStatement.java:2911)
        at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:10643)
        at picUtil.PicUpload.run(PicUpload.java:65)下面是我写的转码方法:
public static byte[] GetImageStr(File pic) {
        FileInputStream in = null;
        byte[] data = null;
        try {
            in = new FileInputStream(pic);
            data = new byte[in.available()];
            in.read(data);
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        BASE64Encoder encoder = new BASE64Encoder();
        return encoder.encode(data).getBytes();
    }
是byte数组太大的问题吗?

解决方案 »

  1.   

    ArrayIndexOutOfBoundsException 一般两个原因,数组太大,或者VM的内存参数设得太小.
      

  2.   

    数组越界吗?
      这个还不好找, 把发生异常的那行代码粘贴出来, debug一下试试
      

  3.   


    我大概知道原因了,我想可能是照片文件太大,一个clob字段存不下
      

  4.   

    我现在也遇到这样的情况,也是大字段,但肯定不是clob存不下,而不会是JVM垮掉了,手动调给1GJVM内存