2016-08-23 4 views
0

I Работа над проектом Java 1.7 с Mysql,Java-MySQL: Как создать хранимую процедуру

У меня есть метод, который вставить много данных в таблице с PreparedStatement, но это вызовет из памяти Ошибка в сервере GlassFish.

Connection c = null; 
    String query = "INSERT INTO users.infos(name,phone,email,type,title) " 
      + "VALUES (?, ?, ?, ?, ?, "; 
    PreparedStatement statement = null; 
    try { 
     c = users.getConnection(); 
     statement = c.prepareStatement(query); 
    } catch (SQLException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 

try{ 
     int i =0; 
     for(Member member: members){ 
      i++; 
      statement.setString(1, member.getName()); 
      statement.setString(2, member.getPhone()); 
      statement.setString(3, member.getEmail()); 
      statement.setInt(4, member.getType()); 
      statement.setString(5, member.getTitle()); 
      statement.addBatch(); 
      if (i % 100000 == 0){ 
       statement.executeBatch(); 
      } 
     } 
     statement.executeBatch(); 
    }catch (Exception ex){ 
     ex.printStackTrace(); 
    } finally { 
     if(c != null) 
     { 
      try { 
       c.close(); 
      } catch (SQLException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
     if(statement != null){ 
      try { 
       statement.close(); 
      } catch (SQLException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
     c = null; 
     statement = null; 
    } 

Я думаю, что мне нужно, чтобы создать хранимую процедуру, чтобы избежать этой проблемы памяти, но я не знаю, с чего начать, и если я должен создать процедуру или функцию, и если я буду в состоянии получить какой-то ответ в ответ или что-то еще?

Что вы думаете об этом?

+0

Как создать хранимую процедуру помощи? Вам необходимо использовать ** транзакцию ** и ** меньшие партии **. –

+0

Попробуйте меньшую партию, а затем загляните в ['try-with-resources'] (https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html). – bradimus

+1

Да, попробуйте размер партии '100' или' 200'. Не '10000'. – Kayaman

ответ

0

Замена оператора insert в подготовленном заявлении вызовом хранимой процедуры в подготовленном документе не влияет на потребление памяти каким-либо значимым образом.

У вас заканчивается память, потому что вы используете очень большой размер партии. Вы должны проверить производительность различных размеров партии - вы обнаружите, что улучшение производительности для больших партий быстро уменьшается с размерами партии больше, чем десятки до сотен.

Возможно, вы сможете достичь более высоких скоростей ввода, используя load data infile. Вы бы взяли много строк данных, создали текстовый файл и загрузили файл. Например, см. this question.

Вы также можете рассмотреть возможность распараллеливания. Например, откройте несколько соединений и вставьте строки в каждое соединение с отдельными потоками. Аналогично, вы можете попытаться выполнить параллельные нагрузки, используя load data infile.

Вам нужно будет попробовать различные методы, размеры партии, количество потоков (возможно, не более одного на ядро) и т. Д. На вашей аппаратной установке, чтобы увидеть, что дает лучшую производительность.

Вы также можете посмотреть настройки некоторых параметров MySQL, капли (и пересоздать) индексы и т.д.

Смежные вопросы