Java数据库应用程序在加载大量记录时冻结

时间:2014-05-13 15:33:40

标签: java mysql user-interface netbeans database-connection

我需要一些有经验的编码人员给我一些建议,我有一个问题。

我创建了一个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;
}

2 个答案:

答案 0 :(得分:1)

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

这些案件有什么用?

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

答案 1 :(得分:0)

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