Я запускаю запрос к базе данных, и он отлично работает, но создание данных для размещения в таблице занимает некоторое время. Я извлекаю 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);
}
Это работает в фоновом потоке. Другие программы позволяют загружать как можно больше данных, и, чтобы конкурировать, я хотел бы разрешить одно и то же. HeidiSQL загружает один и тот же запрос данных и помещает его в таблицу примерно через 5 секунд. –
Тогда как ваше приложение замерзает, если вы делаете это «правильно»? –
это может быть 'tableView.setItems (rows.get (0));' это убивает? который работает на потоке FX ... –