gpt4 book ai didi

java - 每个不同的 SQL 查询是否需要不同的 PreparedStatement 对象?

转载 作者:搜寻专家 更新时间:2023-11-01 02:42:34 24 4
gpt4 key购买 nike

我正在开发一个 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 等呢?我可以为每种类型的操作使用一个公共(public)对象吗(比如每个 SELECT 语句一个对象,每个 INSERT 一个对象,UPDATE 语句一个对象等等) ..)

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

最佳答案

当您调用 conn.prepareStatement 时,您正在创建一个新的对象(假设Connection 对象不是某种缓存工厂模式,这可能是一个安全的假设)。但是从你的问题来看,你并不是在询问使用相同的对象,而是重复使用相同的变量pstmt。这样做没有错,只需确保 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 驱动程序的特定于数据库的实现)。但即使这样做了,您也会让悬空游标处于打开状态,直到垃圾收集器最终找到它为止。

关于java - 每个不同的 SQL 查询是否需要不同的 PreparedStatement 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30377394/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com