Derby-database 半小时后变慢了

Derby-database is becoming slow after half an hour

首先,对不起,我的标题含糊不清,但我不知道如何用另一种方式来解释它。

问题出在这里:

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

如果我用结果调用查询只会花费更多时间,这是我的 class:

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 或结果集,它会给我一个错误,提示我的结果集未打开。

阅读Manual tuning derby for perfromance improvement。一种理想的方法是使用 PreparedStatement 来利用 derby query Caching

Use prepared statements with substitution parameters

In Derby, as with most relational database management systems, performing an SQL request has two steps: compiling the request and executing it. When you use prepared statements (java.sql.PreparedStatement) instead of statements (java.sql.Statement) you can help Derby avoid unnecessary compilation, which saves time. In general, any query that you will use more than once should be a prepared statement.

已修复!当然,preparestatements 使查询更快,但这不是这里的问题。

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

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

谢谢大家!