【问题标题】:Do I need different objects of PreparedStatement for each different SQL Query?对于每个不同的 SQL 查询,我是否需要不同的 PreparedStatement 对象?
【发布时间】:2015-05-21 14:56:35
【问题描述】:

我正在开发一个 java 应用程序并使用 Derby 数据库。

我有一个名为 pstmt 的 PreparedStatement 对象。

1) 我可以为每个 SELECT 语句(如这些语句和其他语句)使用相同的对象(这里是 pstmt)吗(这会是一种有效的方法吗)?

例如:

pstmt = conn.prepareStatement("SELECT NAME FROM TABLE1 ORDER BY NAME");
pstmt = conn.prepareStatement("SELECT * FROM TABLE1 ORDER BY NAME");
pstmt = conn.prepareStatement("SELECT * FROM TABLE1 WHERE .....");

或者我必须为每个不同的 SQL 语句创建不同的对象,如下所示..

pstmt1 = conn.prepareStatement("SELECT NAME FROM TABLE1 ORDER BY NAME");
pstmt2 = conn.prepareStatement("SELECT * FROM TABLE1 ORDER BY NAME");
pstmt3 = conn.prepareStatement("SELECT * FROM TABLE1 WHERE .....");

2) 还有其他语句,如 CREATE、INSERT、UPDATE 等。我可以为每种类型的操作使用一个通用对象吗(例如每个 SELECT 语句一个对象,每个 INSERT 一个对象,UPDATE 语句一个对象等等..)

我知道它的优点,但我对有效使用它感到困惑。

【问题讨论】:

    标签: java jdbc prepared-statement


    【解决方案1】:

    当您调用conn.prepareStatement 时,您正在创建一个新的对象(假设Connection 对象不是某种缓存工厂模式,这可能是一个安全的假设)。但从您的问题来看,您不是在问使用相同的 object,而是重复使用相同的 variablepstmt。这样做没有错,只要确保close()上一个,否则你会泄漏游标:

    pstmt = conn.prepareStatement("SELECT NAME FROM TABLE1 ORDER BY NAME");
    // Missing pstmt.close();
    pstmt = conn.prepareStatement("SELECT * FROM TABLE1 ORDER BY NAME");
    

    第二个赋值丢失了对前一个pstmt 的引用,而没有调用close()。希望它会在垃圾收集器拾取它时关闭(取决于 JDBC 驱动程序的特定于数据库的实现)。但即使是这样,你也会让一个悬空的光标处于打开状态,直到垃圾收集器最终找到它。

    【讨论】:

    • 什么是缓存工厂模式和泄漏游标?你能附上任何链接来引用这些吗?
    • 泄漏游标是您没有close() 的任何语句。 Wrt 缓存 - Connection 对象理论上可以返回以前使用过的PreparedStatement 对象,如果它已经准备了相同的字符串(即缓存),尽管我承认我还没有遇到这样做的 JDBC 实现.
    【解决方案2】:

    重复使用相同的PreparedStatement 完全没问题。我宁愿说它比创建多个 PreparedStatement 对象更有效。更多详情,您可以通过此链接http://www.jooq.org/doc/3.2/manual/sql-execution/reusing-statements/#N129B1

    关于第二个疑问,不要为CREATEINSERTUPDATE 使用不同的PrepareStatement 对象,(如果使用不重叠)您甚至可以将单个PreparedStatement 对象用于所有声明。

    【讨论】:

    • "如果使用不重叠" - 这是什么意思?
    • 所以我可以使用 single 对象来处理任何类型的语句?
    • @santosh-patil,我对提供的链接的理解略有不同。文章(在链接中提供)讨论了使用相同的 SQL 但参数不同或没有参数重用相同的PreparedStatement。问题,据我了解,询问对不同的 PreparedStatement SQL 使用相同的变量,这反过来会引入不同的数据库对象。如果您可以添加一些其他参考来证明您的答案是正确的,那就更好了。
    猜你喜欢
    • 1970-01-01
    • 2013-05-23
    • 1970-01-01
    • 2017-05-18
    • 2020-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多