德比数据库在半小时后变得缓慢

时间:2015-08-27 19:31:28

标签: java database performance derby

首先,抱歉我的模糊标题,但我不知道如何以另一种方式解释它。

问题在于:

我的应用程序使用嵌入式数据库(apache derby)。工作得很好,很快,直到30分钟左右。之后,加载SELECT查询需要花费更多时间。最多需要15秒,而通常需要1秒钟。这是正常的吗?因为我真的不知道我应该从哪里开始寻找,如果你知道我的意思。我有两个类来处理我的查询:一个有结果,一个没有结果。

因为我用结果调用查询只需要更多时间,所以这是我的类:

public class QueryLauncherResult extends SwingWorker<ResultSet, Void> {

private Connection conn = null;
private Statement stmt = null;
protected String query;
public ResultSet result;
public AbstractModel model;
JFrame frame;
private JPanel  loadingBar;

public QueryLauncherResult() {

}

public void setLoadingBar(JPanel  bar) {
    loadingBar = bar;
}

public void setModel(AbstractModel model){ 
    this.model = model;
}

public void setConnection(Connection conn) {
    this.conn = conn;
}

public void setQuery(String query) {
    this.query = query;
}

private Connection getConnection() {
    return conn;
}



@Override
protected ResultSet doInBackground() throws SQLException {
        if(loadingBar == null) {
            // do nothing
        } else {
                loadingBar.setVisible(true);
        }

        stmt = conn.createStatement();
        result = stmt.executeQuery(query);

        return result;
}


@Override
protected void done() {

    model.result = result;
    model.update();

    if(loadingBar == null) {
        // do nothing
    } else {
            loadingBar.setVisible(false);
    }


}





}

编辑:

所以,我现在已经尝试过了:

    @Override
protected ResultSet doInBackground() throws SQLException {
        if(loadingBar == null) {
            // do nothing
        } else {
                loadingBar.setVisible(true);
        }

        stmt = conn.prepareStatement(query);
        //stmt = conn.createStatement();
        //result = stmt.executeQuery(query);
        result = stmt.executeQuery();
        //conn.setAutoCommit(false);

        return result;
}


@Override
protected void done() {

    model.result = result;
    model.update();





    if(loadingBar == null) {
        // do nothing
    } else {
            loadingBar.setVisible(false);
    }


}

仍然没有表现的迹象。如果我在done()方法中关闭stmt或resultset,它会给我一个错误,我的结果集没有打开。

2 个答案:

答案 0 :(得分:0)

阅读Manual tuning derby for perfromance improvement。一种理想的方法是使用PreparedStatement来使用derby查询缓存

  

使用带有替换参数的预准备语句

  在Derby中,与大多数关系数据库管理系统一样,执行SQL请求有两个步骤:编译请求并执行它。当您使用预准备语句(java.sql.PreparedStatement)而不是语句(java.sql.Statement)时,您可以帮助Derby避免不必要的编译,从而节省时间。通常,您将多次使用的任何查询都应该是一个准备好的语句。

答案 1 :(得分:0)

修正了它!确保预先表示使查询更快,但这不是问题所在。

问题是这样的。 &#39;模型&#39;仍在更新旧视图,而GUI只显示了新的视图。我现在在刷新时删除旧视图 - 刷新我的意思(SELECT *)查询,在我的模型中添加新视图并在之后更新它们。

应用程序不再有任何问题。总是很快!

谢谢你们!