【问题标题】:Java database application Freezing when loading lots of recordsJava数据库应用程序加载大量记录时冻结
【发布时间】: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


【解决方案1】:

您在这里看到的是数据库需要 大量时间 (?) 来解决您的查询,因为您正在加载大量记录。此调用是同步调用,因此应用程序将等待,直到数据库可以生成包含所有结果的正确响应。

这些情况该怎么办?

通常,您在另一个线程中执行此缓慢工作,并向用户显示一个不错的正在加载消息/gif/动画/等。后台线程完成其工作后,将数据检索回主线程并继续当前的工作。

【讨论】:

    【解决方案2】:

    您可以通过创建一个新线程来加载数据来消除冻结。如果您希望用户等待数据,您可以提供一个进度条或微调器来显示它正在加载。否则,您可以让用户在后台加载数据时与 UI 进行交互。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多