2014-11-17 2 views
-1

Я запускаю запрос к базе данных, и он отлично работает, но создание данных для размещения в таблице занимает некоторое время. Я извлекаю 500 000 строк данных, и я не думаю, что это должно занять очень много времени, чтобы отобразить это, но мое приложение перестает отвечать на запросы из-за того, сколько времени потребуется. Я попробовал один и тот же запрос в разных приложениях, и они загружают очень быстро. Могу ли я что-нибудь сделать, чтобы ускорить добычу?Оптимизация большого MySQL ResultSet

public ArrayList<HashMap<String, ArrayList>> runQueries(String query){ 
    ArrayList<HashMap<String, ArrayList>> arrayList = new ArrayList<>(); 
    try{ 
     Statement stmt = conn.createStatement(); 
     stmt.execute(query); 
     while(true){ 
      HashMap<String, ArrayList> hm = new HashMap<>(); 
      // Get next resultset if no resultset was returned. 
      // The query was either an insert, update or delete 
      if(stmt.getUpdateCount() > -1){ 
       stmt.getMoreResults(); 
       continue; 
      } 
      // If the resultset is null exit 
      if(stmt.getResultSet() == null){ 
       break; 
      } 
      // We have a resultset! 
      // Save the columns to an array 
      // We can then display them later 
      ResultSet rs = stmt.getResultSet(); 
      int numColumns = rs.getMetaData().getColumnCount(); 
      ArrayList<String> columns = new ArrayList(); 
      for(int i = 0; i < numColumns; i++){ 
       columns.add(rs.getMetaData().getColumnName(i + 1)); 
      } 
      // Save the columns to the hashmap 
      hm.put("columns", columns); 

      // We now need to save the rows to an array as well 
      // We can then display them later as well 
      ObservableList<ObservableList<String>> oblist = FXCollections.observableArrayList(); 
      while(rs.next()){ 
       ObservableList<String> row = FXCollections.observableArrayList(); 
       for(int i = 1; i <= numColumns; i++){ 
        row.add(rs.getString(i)); 
       } 
       oblist.add(row); 
      } 
      ArrayList<ObservableList> rows = new ArrayList<>(); 
      rows.add(oblist); 
      rs.close(); 
      // Save the rows to the hashmap 
      hm.put("rows", rows); 
      // Save the hashmap to the final array 
      arrayList.add(hm); 
      stmt.getMoreResults(); 
     } 
    }catch(SQLException ex){ 
     Logger.getLogger(Mysql.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    return arrayList; 
} 

Edit:

Я свели к разделу, требуется некоторое время для запуска:

ObservableList<ObservableList<String>> oblist = FXCollections.observableArrayList(); 
while(rs.next()){ 
    ObservableList<String> row = FXCollections.observableArrayList(); 
    for(int i = 1; i <= numColumns; i++){ 
     row.add(rs.getString(i)); 
    } 
    oblist.add(row); 
} 

ответ

2

Во-первых: Не загружайте все записи. Зачем вам это делать? Вы можете реализовать какую-то разбивку на страницы в своем приложении. I.e. Добавьте две простые кнопки ниже таблицы «Предыдущий» и «Следующий» и «Поиск» выше. В начале загружайте, т. Е. 100 записей. При каждом нажатии загружаются следующие 100 записей и т. Д. Если пользователь ищет конкретную запись, он может использовать поле «Поиск».

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

+0

Это работает в фоновом потоке. Другие программы позволяют загружать как можно больше данных, и, чтобы конкурировать, я хотел бы разрешить одно и то же. HeidiSQL загружает один и тот же запрос данных и помещает его в таблицу примерно через 5 секунд. –

+0

Тогда как ваше приложение замерзает, если вы делаете это «правильно»? –

+0

это может быть 'tableView.setItems (rows.get (0));' это убивает? который работает на потоке FX ... –

0

Попробуйте заменить

 if(stmt.getUpdateCount() > -1){ 
      stmt.getMoreResults(); 
      continue; 
     } 
     if(stmt.getResultSet() == null){ 
      break; 
     } 

с

 if(stmt.getUpdateCount() > -1){ 
      if (!stmt.getMoreResults()) { 
       break ; 
      } 
     } 
+0

. Это не влияет на скорость преобразования набора результатов в наблюдаемую таблицу (часть, которая кажется быть узким местом). –

+0

Можете ли вы подтвердить, что вы когда-либо выходите из своего основного цикла? Вы сказали ранее, что он никогда не попадает на сцену, где вы вызываете tableView.getItems() ... –

+0

Да, для небольших запросов он отлично работает. Я выполнил запросы, которые возвращают 100k строк, и он выходит из цикла –

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