我需要一些有经验的编码人员给我一些建议,我有一个问题。
我创建了一个Java SE应用程序,它处理MySQL服务器上本地存储的数据。 它在有少量数字或记录的情况下工作正常,但是当我开始拉大量记录时,它有时会冻结应用程序几秒钟,直到它获得所有数据。
我使用了DAO模式,并确保每次完成后都关闭连接。 我99%的时间使用预备声明 (我没有使用它的唯一时间没有连接到冻结的程序部分)
我试图小批量加载记录,这样可以减少冻结,但对我来说仍然是个问题。
当应用程序冻结并且没有看到任何错误时,我检查了 NetBeans 中的日志,只有像system.out.println
这样的东西我放入各种循环和函数处理数据。我只是看到 NetBeans 输出日志,system.out.println
文本向上滚动,因为应用程序在后台工作,而GUI被冻结。
我想知道我能做些什么来阻止冻结或至少减少它?
我一直在考虑使用像c3p0这样的API,但我想先问你的意见。
以下是GUI部分
中的代码示例 fx_trade_model ftm = new fx_trade_model();
ArrayList all2 = ftm.loadall_B(t);
这是来自fx交易模型类的load all_B函数,它扩展了我的DAO类:
public ArrayList loadall_B(int x) throws SQLException {
ArrayList g = new ArrayList();
connect = Get_Conn();
statement = connect.createStatement();
resultSet = statement.executeQuery("select * from fx_trade limit "+ x +" ");
//preparedStatement.setInt(1, x);
while (resultSet.next()) {
fx_trade t = new fx_trade();
t.id = resultSet.getInt("id");
t.BS = resultSet.getString("BS");
t.account_id = resultSet.getInt("Account_id");
t.comm = resultSet.getDouble("comm");
t.fr = resultSet.getString("fr");
t.to = resultSet.getString("to");
t.price = resultSet.getDouble("price");
t.amount = resultSet.getInt("amount");
t.settle_date = resultSet.getDate("Settle_Date");
t.trade_date = resultSet.getDate("Trade_Date");
t.note = resultSet.getString("note");
//get qty in stock
t.qty = get_qty(t.id);
g.add(t);
}
connect.close();
return g;
}
答案 0 :(得分:1)
您在这里看到的是数据库需要大量时间(?)来解决您的查询,因为您正在加载大量记录。此调用是同步调用,因此应用程序将等待数据库生成具有所有结果的正确响应。
这些案件有什么用?
通常,您在另一个线程中执行此慢速工作,并向用户显示一个不错的正在加载消息/ gif / animation / etc.后台线程完成其工作后,它将数据检索回主线程并继续当前的工作。
答案 1 :(得分:0)
您可以通过创建新线程来加载数据来消除冻结。如果您希望用户等待数据,您可以提供进度条或微调器以显示它正在加载。否则,您可以让用户在后台加载数据时与UI进行交互。