将准备好的语句OBJECTS放在Java中的位置?

str*_*rry 5 java jdbc prepared-statement

我想用预备语句.我已经读过,预处理语句的优点是它们不必每次都被解析/编译,因此减少了负载.现在我的问题是,在Java或我的数据库系统中,对已经准备好的语句的"识别"发生了什么?我问,因为我想知道在我的代码中将PreparedStatement对象存储在何处:作为class属性并为每个请求设置参数或者在有请求时创建一个新的预准备语句对象.

    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");
       }
   }
Run Code Online (Sandbox Code Playgroud)

现在我的问题是,选择1还是2,更好的方法是什么?但是,每次执行后我都必须做一个"清理" myStatement.close()吗?

也许我应该以另一种方式问它:如何以最有效的方式重复使用它?

更新:如果有两个答案,一个更喜欢选项1和一个选项2,我会请社区投票选择他们的选择^^

Zee*_*mee 5

SQL 数据库正在缓存以完整查询(包括where子句)为关键字的语句的执行计划。通过使用准备好的语句,无论您使用什么值,查询都是相同的(它们总是“?”)。

因此,从数据库缓存的角度来看,您的两个选项之间没有区别。请参阅本文,其中还描述了一些 Java EE 特定问题。

但是,正如其他人提到的,从代码的角度来看,当然还有其他一些因素,尤其是当您经常重用它时(如本例中所示)。重要的是一些 JDBC 驱动程序支持预编译
请记住,准备好的语句最初是开销,同时赶上每个后续使用 - 这里有一个很好的章节