2015-01-20 3 views
1

Когда мне приходится иметь дело с MySQL DB в Java, я использую драйвер, разработанный самим MySQL. С этой библиотекой очень легко работать, но у меня вопрос о производительности. Какой метод «закрытия» я должен использовать каждый раз, когда я делаю запрос в БД?Улучшение запроса с помощью соединителя MySQL Java

Если, например, у меня есть цикл for, который делает больше вложений в БД, что я должен использовать?

private void invioInsert(String query){ 
    try { 
     Class.forName("com.mysql.jdbc.Driver").newInstance(); 
    } catch (Exception E) { 
     System.err.println("Non trovo il driver da caricare."); 
     E.printStackTrace(); 
    } 
    try { 
     PreparedStatement statement = conn.prepareStatement(query); 
     statement.execute(); 
     statement.close(); 

    } catch (SQLException E) { 
     System.out.println("SQLException: " + E.getMessage()); 
     System.out.println("SQLState:  " + E.getSQLState()); 
     System.out.println("VendorError: " + E.getErrorCode()); 
    } 
} 

Например, цикл может быть:

for(int i=0; i<=10, i++){ 
    String query = "INSERT TABLE VALUES ("+i+")"; 
    sendQuery(query); 
} 

Так что это полный код для цикла:

for (int i = 0; i < file.getList().size(); i++) { 
     StringTokenizer tokenizer = new StringTokenizer(file.getList().get(i).replace("\"", "")); 
     String ID = tokenizer.nextToken("|"); 
     int j = 0; 
     while(j<5){ 
      tokenizer.nextToken("|"); 
      j++; 
     } 
     String voto = tokenizer.nextToken("|"); 
     String query = "Insert RisultatiGiocatori values ('"+giornata+"','"+ID+"','"+voto+"')"; 
     invioInsert(query); 
    } 
+0

Вы пытаетесь сделать подготовленные заявления или просто простую вставку? Я не могу сказать из вашего кода, потому что вы обращаетесь к обоим. –

+0

Я вставил полный код, который я использую (так что цикл for). –

ответ

1

Это классический UseCase для PreparedStatement с выполнением пакетной :

String query = "INSERT TABLE VALUES (?)"; 
try { 
    PreparedStatement statement = conn.prepareStatement(query); 
    for(int i=0; i<=10, i++){ 
     statement.setInt(1, i); 
     statement.addBatch(); 
    } 
    statement.executeBatch(); 
    statement.close(); 

} catch (SQLException E) { 
    System.out.println("SQLException: " + E.getMessage()); 
    System.out.println("SQLState:  " + E.getSQLState()); 
    System.out.println("VendorError: " + E.getErrorCode()); 
} 
0

Никогда не создавайте внутренние петли PreparedStatement. Попробуйте создать заявление снаружи, и у вас будет отличное улучшение.

+0

Это комментарий, а не ответ. – Victor

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