2017-02-14 4 views
0

Я хочу, чтобы партия вставки 20000 записей, код взрывали:Oracle ojdbc executeBatch слишком медленно

  while ((line = reader.readLine()) != null) { 
       line = line.substring(0, line.lastIndexOf(";")); 
       System.out.println(line); 
       st.addBatch(line); 

       i += 1; 
       if (i % 1000 == 0) { 
        System.out.println("execute:" + i); 
        Date beginBatch = new Date(); 
        st.executeBatch(); 
        Date endBatch = new Date(); 
        System.out.println("Start at: " + beginBatch); 
        System.out.println("End at: " + endBatch); 
       } 
      } 

и Наталья принимает меня за один час до готовой, но когда я запустить этот SQL файл в консоли разработчика Sql, это только взял меня на 3 минуты. Что-то не так. Может ли кто-нибудь помочь мне разобраться в первопричине.

+0

3 минуты очень медленны для 200 000 записей. – BobC

+0

Как улучшить производительность? – user6807013

ответ

-1

Вы никогда не очищаете свою партию. Так, вероятно, в первом исполнении вы Exec 1000 заявлений, на 2-2000 и так далее ...

Вы должны сделать это, добавив что-то вроде

   Date beginBatch = new Date(); 
       st.executeBatch(); 
       st.clearBatch(); 
+2

Выполнить пакет должен очистить пакет после выполнения (даже если он не увенчался успехом, хотя спецификация не на 100% понятна). Спецификация JDBC 4.2 (раздел 14.1.2) гласит: _ «Партия оператора сбрасывается до пустого после возвращения' executeBatch'. "_ –

0

Oracle Database JDBC использует параметры массива для реализации JDBC пакетного выполнения , Нет параметров, поэтому ничего не нужно. Ваша партия выполняет просто очереди операторов и выполняет их по одному, без партии.

Еще час, чтобы выполнить 20 000 операторов SQL, звучит немного медленно, даже если база данных должна выполнять жесткий анализ на каждом SQL. Поскольку SQLDev может выполнять ту же работу за 3 минуты, JDBC должен сделать то же самое. Большая разница - дозирование. Код дозирования драйвера не является бесплатным. Это налагает значительные накладные расходы. Я бы рекомендовал заменить вызов addBatch вызовом для выполнения. Скорее всего, это будет быстрее.