何时应关闭Java PreparedStatement?

9
"使用预处理语句"的教程中指出,它们应该始终被关闭。假设我有一个函数。
getPrice() {
}

我希望这个方法能够被每秒多次调用。这个方法每次调用都需要打开和关闭PreparedStatement吗?这似乎会带来很大的开销。

5个回答

13

首先,PreparedStatement 永远不会被打开。它只是一个预处理的 Statement 被执行。该语句被发送到执行经过 PreparedStatement 编译的 SQL 语句的 RDBMS。连接到 SQL 语句应在查询 SQL 期间保持打开状态,并在不需要其他 RDMS 调用时关闭。

您可以按需发送许多 Statement/PreparedStatement,但必须确保在完成使用后最终关闭其 ResultSetPreparedStatement,然后关闭 RDBMS 连接。


13
这个方法是否应该在每次方法调用时打开和关闭PreparedStatement?
如果您是在方法内创建 PreparedStatement 对象,则必须在使用完毕后关闭它。您可以重复使用 PreparedStatement 对象进行多次执行,但是一旦完成,必须将其关闭。
这是因为,尽管所有 Statement 对象(包括 PreparedStatement)都应在调用 Connection.close() 时关闭,但很少发生。在某些 JDBC 驱动程序中,特别是 Oracle 的驱动程序,如果连接有未关闭的 ResultSet 和 Statement 对象,则驱动程序将无法关闭连接。这意味着,在这些驱动程序上:
- 您不应该丢失对 PreparedStatement 对象的引用。如果这样做,直到垃圾收集发生后,连接才会被关闭。如果您正在为不同的 SQL 语句重复使用 PreparedStatement 实例,则很容易忘记这一点。 - 在不再需要 PreparedStatement 时,应该将其关闭。只有这样,Connection.close() 才能真正拆除物理连接。

0

正如教程中的示例所示,您应该在执行完所有查询后关闭它。

一旦语句被关闭,关系型数据库管理系统可能会释放与您的语句相关的所有资源。因此,如果要进一步使用它,您需要重新准备完全相同的语句。


0
我认为,在每次数据库交互之后,每个组件,如语句和结果集,都必须关闭,除了连接,如果您倾向于执行更多操作。
而且,如果您一遍又一遍地创建准备好的语句,也不需要担心,因为您将一遍又一遍地使用相同的语句,就不会有任何性能问题。

0

是的..如果您创建了准备好的语句n次,那么没有任何问题,因为您将在所有位置使用相同的语句。在这里不需要进行任何性能观察。

谢谢


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接