【发布时间】:2014-05-13 15:33:39
【问题描述】:
对于我遇到的问题,我需要一些更有经验的编码人员的建议。
我创建了一个 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);
这是来自外汇交易模型类的加载 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;
}
【问题讨论】:
-
你试过线程吗?阅读您的问题,您似乎正在 UI 线程上执行此操作。将其移至单独的线程,而不是将结果传回 UI。
-
我担心你每次调用的
get_qty()函数也会使用数据库访问。那会大大减慢这件事的速度。您应该尝试使用单个查询获取所有数据 - 并将它们放在后台线程中。
标签: java mysql user-interface netbeans database-connection