java - 在 Java 中将准备好的语句 OBJECTS 放在哪里?

标签 java jdbc prepared-statement

我想使用准备好的语句。我读过准备好的语句的优点是它们不必每次都被解析/编译,因此可以减少负载。现在我的问题是,在 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/

相关文章:

java - JDBC 连接关闭

mysql - 是否可以使用预准备语句在 MySQL 中创建表?

java - 使用 Teradata jdbc 驱动程序设置 FASTLOADCSV Tenacity 和 Sleep

java - 如何修复此错误 : I/System. out : java. lang.ClassNotFoundException : com. mysql.jdbc.driver java.lang.NullPointerException

php - 提供带有数组的准备好的语句

php - 使用 like 子句执行准备好的 PDO 语句

java - 在 BufferedReader 中获取 read() 返回的字符

java - 如何创建 IntList 的实例?

java - 使用 DynamoDBMapper 保存具有版本化属性的新项目

java - 合并同一级别的数字