【发布时间】:2012-08-28 00:00:06
【问题描述】:
我想使用准备好的语句。我已经读过准备好的语句的优点是它们不必每次都再次解析/编译,因此可以减少负载。现在我的问题是,在 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,我恳请社区为他们的选择投票^^
【问题讨论】:
-
不重复使用准备好的语句有什么用?
-
@Tichodroma 避免 SQL 注入(当然,还有其他方法可以达到同样的效果)
-
问题是如何以最有效的方式重用它。
-
@Tichodroma 这就是我的观点 ;-) 因此,我问,数据库系统是否识别已经准备好的语句(字符串比较或其他),或者我是否必须通过使用相同的语句来处理这个问题对象......也许“preparedStatement()”的使用在查询被发送到数据库系统时添加了一个标志?!
-
首先 - 不要盲目相信您阅读的建议。措施!一些数据库驱动程序在准备时会做很多工作,以至于需要对准备好的语句进行数百次调用才能完成工作。
标签: java jdbc prepared-statement