데이터베이스에 대해 쿼리를 실행 중이지만 제대로 작동하지만 테이블에 배치 할 데이터를 작성하는 데 다소 시간이 걸립니다. 나는 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;
}
편집 : 실행하는 데 시간이 걸리는 부분으로 좁혀
:
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 스레드에서 실행되는 ... –