Не удалось преобразовать данные CLOB в строку

Я пытаюсь преобразовать данные java.sql.Clob в String с помощью метода SubString (этот метод дает хорошую производительность по сравнению с другими). Данные clob, близкие или превышающие 32MB. КАК мой метод подстроки наблюдения может возвращать только до 33554342 байт.

если данные clob пересекают 33554342 байта, то это исключение ниже sql
ORA-24817: Unable to allocate the given chunk for current lob operation

ИЗМЕНИТЬ КОД:

public static void main(String[] args) throws SQLException {

    Main main = new Main();
    Connection con = main.getConnection();
    if (con == null)    {
        return;
    }

    PreparedStatement   pstmt   =   null;
    ResultSet   rs  =   null;
    String sql  =   "SELECT Table_ID,CLOB_FILE FROM TableName WHERE SOMECONDITION ";

    String table_Id = null;
    String directClobInStr  =   null;
    CLOB clobObj = null;
    String clobStr = null;
    Object obj= null;
    try {
        pstmt   =   con.prepareStatement(sql);
        rs      =   pstmt.executeQuery();
        while (rs.next())   {
            table_Id    =  rs.getString( "Table_ID" ) ; 
            directClobInStr =  rs.getString( "clob_FILE" ) ;
                      obj       =  rs.getObject( "CLOB_FILE");

            clobObj = (CLOB) obj;
             System.out.println("Table id " + table_Id);
             System.out.println("directClobInStr "   + directClobInStr);
             clobStr = clobObj.getSubString(1L, (int)clobObj.length() );//33554342
             System.out.println("clobDataStr = " + clobStr);
        }
    }
    catch (SQLException e) {
        e.printStackTrace();
        return;
    }
    catch (Exception e) {
        e.printStackTrace();
        return;
    }
    finally {
        try {
        rs.close();
        pstmt.close();
        con.close();
        }
        catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
}

ПРИМЕЧАНИЕ: здесь obj = rs.getObject( "CLOB_FILE"); работает, но я этого не ожидаю. потому что я получаю объект ResultSet откуда-то как Object. Мне нужно преобразовать и получить данные из CLOB

Любая идея, как этого добиться?


person Giri    schedule 12.06.2015    source источник
comment
Пожалуйста, покажите свой код!   -  person OldProgrammer    schedule 12.06.2015
comment
увеличение shared_pool_size и java_pool_size может помочь   -  person Rajat Garg    schedule 12.06.2015
comment
@Rajat, я пробовал, увеличив размер пула Java. но не повезло   -  person Giri    schedule 12.06.2015
comment
@OldProgrammer: - Я обновил фрагмент кода.   -  person Giri    schedule 12.06.2015
comment
Какова конкретная версия базы данных, которую вы используете?   -  person mmmmmpie    schedule 12.06.2015
comment
@mmmmpie, 11.2.0.3.0 - 64-bit   -  person Giri    schedule 12.06.2015
comment
Я думаю, что @OldProgrammer попал в самую точку.   -  person mmmmmpie    schedule 12.06.2015
comment
Где я могу получить source jar и javadoc для OJDBC5.jar . Пожалуйста, поделитесь URL. (в гугле не нашел)   -  person Giri    schedule 15.06.2015
comment
Может быть, OT: я не уверен насчет JDBC, но, по крайней мере, в OCI вы можете запросить базу данных Oracle о рекомендуемом размере фрагмента выборки. И затем вы должны получить LOB на (умноженный) размер выборки. Как ответил @acesargl. Насколько я знаю, вы достигли предела PGA, ваш сеанс не может выделить такой большой буфер на стороне сервера БД.   -  person ibre5041    schedule 15.06.2015


Ответы (1)


Вместо:

clobStr = clobObj.getSubString(1L, (int)clobObj.length() );

Попробуйте что-то вроде:

int toread = (int) clobObj.length();
int read = 0;
final int block_size = 8*1024*1024;
StringBuilder str = new StringBuilder(toread);
while (toread > 0) {
    int current_block = Math.min(toread, block_size);
    str.append(clobObj.getSubString(read+1, current_block));
    read += current_block;
    toread -= current_block;
}
clobStr = str.toString();

Он извлекает подстроки, используя цикл (8 МБ за итерацию).

Но помните, что, насколько мне известно, Java Strings ограничены 2 ГБ (это причина, по которой read объявляется как int, а не long), а Oracle CLOB ограничены 128 ТБ.

person acesargl    schedule 15.06.2015