我想使用准备好的语句。我读过准备好的语句的优点是它们不必每次都被解析/编译,因此可以减少负载。现在我的问题是,在 Java 中还是在我的数据库系统中,已经准备好的语句的“识别”发生在哪里?我问,因为我想知道在我的代码中存储我的 PreparedStatement 对象的位置:作为类属性并为每个请求设置参数,或者在有请求时创建一个新的准备好的语句对象。
public class Option1 {
private PreparedStatement myStatement;
public Option1() {
// create the myStatement object
myStatement = conn.prepareStatement("");
}
public List<Items> query() {
// just use the myStatement object
myStatement.setString(1, "foo");
}
}
public class Option2 {
public List<Items> query() {
PreparedStatement myLocalStatement = conn.prepareStatement("");;
// create and use the statement
myLocalStatement.setString(1, "foo");
}
}
现在我的问题是,更好的方法是什么,选项 1 还是选项 2?但是,我必须在每次执行后通过执行 myStatement.close()
进行“清理”,对吗?
也许我应该换个方式问:如何以最有效的方式重用它?
更新:如果有两个答案,一个更喜欢选项 1,一个更喜欢选项 2,我恳请社区为他们的选择投票 ^^
最佳答案
SQL 数据库正在缓存以完整查询(包括where
子句)为键的语句的执行计划。通过使用准备好的语句,查询是相同的,无论您使用什么值(它们总是“?”)。
因此,从数据库缓存的角度来看,您的两个选项之间没有区别。参见 this article ,其中还描述了一些 Java EE 特定问题。
但是,正如其他人提到的,从代码的角度来看,当然还有一些其他因素,尤其是当您经常重用它时(例如 this example )。重要的是一些 JDBC 驱动程序支持 precompilation .
请记住,准备好的语句最初是开销,同时 catch 每次后续使用 - 这里是 great chapter about that .
关于java - 在 Java 中将准备好的语句 OBJECTS 放在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12244627/