2015-07-06 2 views
0

У меня есть приложение Java, которое читает файлы и записывает в oracle db по строкам. Мы столкнулись с странной ошибкой во время пакетной вставки, которая не возникает во время последовательной вставки. Ошибка странная, потому что это происходит только с IBM JDK7 на платформе AIX, и я получаю эту ошибку в разных строках каждый раз. Мой код выглядит следующим образом:clearing batch readystatements

prpst = conn.prepareStatement(query); 
while ((line = bf.readLine()) != null) { 
    numLine++; 
    batchInsert(prpst, line); 
    //onebyoneInsert(prpst, line); 
} 

private static void batchInsert(PreparedStatement prpst, String line) throws IOException, SQLException { 
    prpst.setString(1, "1"); 
    prpst.setInt(2, numLine); 
    prpst.setString(3, line); 
    prpst.setString(4, "1"); 
    prpst.setInt(5, 1); 
    prpst.addBatch(); 
    if (++batchedLines == 200) { 
    prpst.executeBatch(); 
    batchedLines = 0; 
    prpst.clearBatch(); 
    } 
} 

private static void onebyoneInsert(PreparedStatement prpst, String line) throws Exception{ 
    int batchedLines = 0; 
    prpst.setString(1, "1"); 
    prpst.setInt(2, numLine); 
    prpst.setString(3, line); 
    prpst.setString(4, "1"); 
    prpst.setInt(5, 1); 
    prpst.executeUpdate(); 
} 

Я получаю эту ошибку в режиме вставки пакетного:

java.sql.BatchUpdateException: ORA-01461: can bind a LONG value only for insert into a LONG column 

     at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:10345) 

Я уже знаю, почему эта ошибка Ora происходит, но это не мой случай. Я почти уверен, что я не устанавливаю некоторые большие данные в меньшую колонку. Возможно, я нахожусь в некоторых ошибках в IBM jdk7, но не могу этого доказать. Мой вопрос, если есть способ, которым я могу избежать этой проблемы? Вставка один за другим не является вариантом, потому что у нас большие файлы, и это занимает слишком много времени.

ответ

0

Попробуйте с

prpst.setInt (5, новый Integer (1))

Какой тип переменной "numLine"? Можете ли вы поделиться типом столбцов, соответствующих полям, установленным в PreparedStatement? Попробуйте один раз обработать «onebyoneInsert». Поделитесь выводами для этого случая. Это может помочь выявить первопричину. Также напечатайте значение «numLine» для консоли.