2015-08-25 3 views
-1

У меня возникла проблема с очень медленным соединением между моим кодом Java и удаленной базой данных MySQL, когда я использую несколько запросов.JDBC с MySQL очень медленный, почему

Это мой код

ArrayList<Server_Log> ar =Server_Log_Utilities.getBy2Dates(cmb_date.getSelectedItem() + "", cmb_date2.getSelectedItem() + ""); 
    for (int c = 0; c < ar.size(); c++) { 
    Server_Log sl = ar.get(c); 

    String username = User_Utilities.getUserName(sl.getUser() + ""); 
    String row[] = {sl.getDate(), sl.getTime(), username, sl.getReff(), sl.getDescription()}; 
    } 

но пользователь этот код данных будет загружаться быстро

ArrayList<Server_Log> ar =Server_Log_Utilities.getBy2Dates(cmb_date.getSelectedItem() + "", cmb_date2.getSelectedItem() + ""); 
    for (int c = 0; c < ar.size(); c++) { 
    Server_Log sl = ar.get(c); 
    String row[] = {sl.getDate(), sl.getTime(), sl.getReff(), sl.getDescription()}; 
    } 

это User_Utilities.getUserName (sl.getUser() + ""); Метод

public static String getUserName(String id) { 

     String UserName=""; 
     try { 

      Connection con = new DBCon().getConnection(); 
       ResultSet rst = DBHandle.getData(con, "SELECT username FROM user WHERE id='" + id + "'"); 
       while (rst.next()) { 
        UserName =rst.getString(1); 

       } 
      con.close(); 
     } catch (Exception ex) { 
      Logger.getLogger(User_Utilities.class.getName()).log(Level.SEVERE, null, ex); 

     } 
     return UserName; 
    } 

Server_Log_Utilities.getBy2Dates (cmb_date.getSelectedItem() + "", cmb_date2.getSelectedItem() + ""); Метод

public static ArrayList getBy2Dates(String date1, String date2) { 

     try { 
      ar = new ArrayList<>(); 
      Connection con = new DBCon().getConnection(); 
      ResultSet rst = DBHandle.getData(con, "SELECT * FROM server_log WHERE date BETWEEN '" + date1 + "' AND '" + date2 + "' ORDER BY `date`"); 
      while (rst.next()) { 
       Server_Log ci = new Server_Log(); 
       ci.setId(rst.getInt(1)); 
       ci.setDate(rst.getString(2)); 
       ci.setTime(rst.getString(3)); 
       ci.setReff(rst.getString(4)); 
       ci.setDescription(rst.getString(5)); 
       ci.setUser(rst.getInt(6)); 
       ar.add(ci); 
      } 
      con.close(); 

     } catch (Exception ex) { 
      Logger.getLogger(Student_Utilities.class.getName()).log(Level.SEVERE, null, ex); 

     } 
     return ar; 
    } 
+2

Итак, вы говорите, что если вы удалите строку, которая вызывает 'User_Utilities.getUserName', она работает быстро? Как насчет того, как вы смотрите на то, что * этот * код делает. – Andreas

+0

User_Utilities.getUserName этот код используется для получения имени пользователя по ID пользователя –

+0

@GaniduDeeshan Ну, это медленно. Поскольку вы не показываете свой код, мы не можем вам помочь. – Kayaman

ответ

1

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

Вот почему API-интерфейсы JDBC поддерживают такие понятия, как выгрузка пакетов.

В вашем случае вы звоните getUserName за каждые запись в ar. Рассмотрим способы сокращения количества вызовов.

Пример 1: Если пользователь обычно является одним и тем же или только несколько пользователей генерируют записи журнала, кеширование имен пользователей устраняет избыточный поиск.

Пример 2: Вместо поиска пользователя на клиенте измените Server_Log_Utilities.getBy2Dates, чтобы добавить JOIN в таблицу пользователя. Таким образом, no потребуется дополнительный поворот в базу данных.

Пример 3: Вместо вызова getUserName индивидуально в цикле, собирайте идентификаторы пользователя и найдите имена в пакете. Используйте либо JDBC-пакет из нескольких операторов SELECT, либо используйте один оператор с UserId IN (?,?,?,?,...).

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