Java 优化大型MySQL结果集
我正在对一个数据库运行一个查询,它运行得很好,但是将数据构建到一个表中需要一段时间。我正在检索500000行数据,我不认为显示这些数据需要很长时间,但我的应用程序会因为需要很长时间而停止响应。我在不同的应用程序中尝试了相同的查询,它们加载速度非常快。我能做些什么来加快我的速度吗Java 优化大型MySQL结果集,java,javafx,Java,Javafx,我正在对一个数据库运行一个查询,它运行得很好,但是将数据构建到一个表中需要一段时间。我正在检索500000行数据,我不认为显示这些数据需要很长时间,但我的应用程序会因为需要很长时间而停止响应。我在不同的应用程序中尝试了相同的查询,它们加载速度非常快。我能做些什么来加快我的速度吗 public ArrayList<HashMap<String, ArrayList>> runQueries(String query){ ArrayList<HashMap<
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);
}
第一:不要加载所有记录。你为什么要这么做?您可以在应用程序中实现某种分页。 例如,在您的表格下方添加两个简单按钮“上一个”和“下一个”,并在上方添加搜索字段。开始时,加载100条记录。每次单击后,加载下100条记录等。如果用户正在查找特定记录,他可以使用搜索字段 第二:在后台线程中加载记录,以保持应用程序UI始终响应并防止冻结。了解更多信息。尝试更换
if(stmt.getUpdateCount() > -1){
stmt.getMoreResults();
continue;
}
if(stmt.getResultSet() == null){
break;
}
与
这确实在后台线程中运行。其他程序允许根据需要加载尽可能多的数据,为了竞争,我希望允许同样的事情。HeidiSQL加载相同的数据查询,并在大约5秒钟内将其放入表中。那么,如果操作正确,应用程序将如何冻结?可能是tableView.setItemsrows.get0;那就要杀了它?在FX线程上运行的…@RyanNaddy这段代码实际上应该在FX线程上运行。您只能在后台线程上运行任务,并将数据块发布到FX线程。JavaFX组件应该在FX线程上更新。该代码不做任何修改应用程序的事情,它只是构建数据并将其保存到ArrayList,所以我在后台运行它。完成后,我运行更新JavaFX应用程序的代码。它是表格的组成部分,并将其放置在应用程序中。这对将结果集转换为可观察表格的速度没有影响,而可观察表格似乎是瓶颈。您能否确认是否退出了主while循环?你之前说过,它永远不会到达调用tableView.getItems的阶段……是的,对于较小的查询,它工作得很好。我已经完成了返回10万行的查询,它退出了循环
if(stmt.getUpdateCount() > -1){
if (!stmt.getMoreResults()) {
break ;
}
}