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