我正在对数据库运行查询,它运行正常,但构建数据以放入表中需要一段时间。我正在检索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);
}
答案 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 ;
}
}