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

标签 java jdbc prepared-statement

我正在开发一个 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/

相关文章:

java - 如何将表名传递给 SELECT COUNT 查询中的准备语句?

php - mysqli_fetch_assoc()期望参数/调用成员函数bind_param()错误。如何获取并修复实际的mysql错误?

java - android - 由 : android. view.ViewRootImpl$CalledFromWrongThreadException 引起

java - 看不到我在 JFrame 中添加的 JButtons(JLabel)

mysql - MySQL 的 JDBC 驱动程序 - 查询包装?

oracle - 是否可以通过 Oracle 中的绑定(bind)变量引用列名?

java - Hadoop mapper 和 reducer 值类型不匹配错误

java - spring-data-jpa 存储库在查询中使用 Collection 作为 @Param

java - Mysql DB select from table where字段语句java

mysql - 为多个值编写一个 SQL 查询