Java 优化大型MySQL结果集

Java 优化大型MySQL结果集,java,javafx,Java,Javafx,我正在对一个数据库运行一个查询,它运行得很好,但是将数据构建到一个表中需要一段时间。我正在检索500000行数据,我不认为显示这些数据需要很长时间,但我的应用程序会因为需要很长时间而停止响应。我在不同的应用程序中尝试了相同的查询,它们加载速度非常快。我能做些什么来加快我的速度吗 public ArrayList<HashMap<String, ArrayList>> runQueries(String query){ ArrayList<HashMap<

我正在对一个数据库运行一个查询,它运行得很好,但是将数据构建到一个表中需要一段时间。我正在检索500000行数据,我不认为显示这些数据需要很长时间,但我的应用程序会因为需要很长时间而停止响应。我在不同的应用程序中尝试了相同的查询,它们加载速度非常快。我能做些什么来加快我的速度吗

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 ;
            }
        }