首先,抱歉我的模糊标题,但我不知道如何以另一种方式解释它。
问题在于:
我的应用程序使用嵌入式数据库(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,它会给我一个错误,我的结果集没有打开。
答案 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 *)查询,在我的模型中添加新视图并在之后更新它们。
应用程序不再有任何问题。总是很快!
谢谢你们!