优化大型MySQL ResultSet

时间:2014-11-17 23:10:50

标签: java javafx

我正在对数据库运行查询,它运行正常,但构建数据以放入表中需要一段时间。我正在检索500,000行数据,我不认为显示它需要很长时间,但我的应用程序因为需要多长时间而停止响应。我在不同的应用程序中尝试了相同的查询,并且加载速度非常快。我有什么办法可以加快我的速度吗?

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

2 个答案:

答案 0 :(得分:2)

首先:不要加载所有记录。你为什么要那样做?您可以在应用程序中实现某种分页。 即在上方“Previous”和“Next”以及“Search”字段下方添加两个简单按钮。首先,加载即100条记录。每次点击,加载下100条记录等。如果用户正在寻找特定记录,他可以使用“搜索”字段。

第二:在后台线程中加载您的记录,以保持您的应用程序UI始终响应并防止冻结。详细了解concurrency in JavaFX

答案 1 :(得分:0)

尝试替换

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

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