2016-09-21 2 views
0

Я пытаюсь обновить данные в таблице с помощью пакетного обновления. Когда я обновляю данные, есть некоторые сбои. Я хочу получить инструкцию по обновлению сбойного запроса. Например, если сбой запроса - "update table set abc= 123". Затем я хочу, чтобы обработчик исключений возвращал этот SQL-запрос.Обработка исключений JDBC BatchUpdate с использованием BatchUpdateExcpetion

Я пробовал несколько способов получить SQL-запрос, но я не могу этого сделать.

Ниже приведен код:

String line=null; 
int cnt=0; 
int batchSize=100; 
BufferedReader br2=new BufferedReader(new FileReader("clean.txt")); 
stmt1=conn.createStatement(); 
while((line = br2.readLine()) != null) 
{ 
    try { 
     String sql = line; 
      stmt1.addBatch(sql); 
     //System.out.println(cnt); 
      if(++cnt % batchSize == 0) 
      { 
       stmt1.executeBatch(); 
       conn.commit(); 
      }       
     } 
    catch (BatchUpdateException ex) { 
     System.out.println(ex.getLocalizedMessage()); 
       int[] updateCount = ex.getUpdateCounts(); 
        int cnt1 = 1; 
        for (int i : updateCount) { 
         if (i == Statement.EXECUTE_FAILED) { 
          System.out.println("Error on request " + cnt1 +": Execute failed"); 
         } else { 
          System.out.println("Request " + cnt1 +": OK"); 
         } 
         cnt1++; 
        } 
       } 
} 
System.out.println("done"); 
br2.close(); 

Пожалуйста, дайте мне знать, что я должен сделать, чтобы получить не удалось запроса SQL. Поэтому, если у меня есть запрос, я могу сохранить это в файле снова.

ответ

0

Точный смысл getUpdateCounts зависит от реализации драйвера: спецификация JDBC допускает, что либо он только содержит обновление отсчетов успешно выполнены заявления до первого отказа, или она содержит все операторы выполняется, где сбои, отмеченные значение EXECUTE_FAILED; от BatchUpdateException:

После команды в обновлении пакетного не выполняет должным образом и BatchUpdateException брошено, водитель может или не может продолжать обрабатывать оставшиеся команды в пакетном режиме. Если драйвер продолжает обработку после сбоя, массив, возвращаемый методом BatchUpdateException.getUpdateCounts, будет иметь элемент для каждой команды в пакете, а не только для элементов, которые успешно выполнялись до ошибки. В случае, когда драйвер продолжает обрабатывать команды, элемент массива для любой неудавшейся команды - Statement.EXECUTE_FAILED.

Другими словами, если вы хотите знать неудачные заявления есть два случая ручки:

  1. Длина обновления отсчитывает массив является меньшим, чем количество пакетных заявлений.
    В этом случае успешно выполнены первые операторы (массив). Оператор (длина массива) + 1 не выполнен, а остальные операторы не выполнены.
  2. Длина массива равна количеству пакетных утверждений.
    В этом случае вы можете перебирать массив, и все индексы со значением Statement.EXECUTE_FAILED были неудачными.

Для обоих случаев вам необходимо вести бухгалтерский учет, чтобы отслеживать, какие операторы были в пакете, и сопоставлять их с индексами неудачных и/или не выполняемых операторов.