【问题标题】:Proper way to close connection关闭连接的正确方法
【发布时间】:2018-03-16 08:48:13
【问题描述】:

我们在项目中使用连接池。我们在我们的项目中看到连接关闭后语句被关闭。我知道在连接池的情况下,连接关闭后,与数据库的物理连接不会关闭,而是返回池以供重用。所以我的问题是:

如果在连接关闭后关闭语句会发生什么?语句是否会正确关闭/关闭连接会关闭所有语句并且关闭语句是多余的/语句是打开的并且虽然连接返回到池中,但由于打开的语句而不能重用? (我们同时使用 Statement 和 PreparedStatement)。

【问题讨论】:

    标签: java jakarta-ee jdbc database-connection


    【解决方案1】:

    如果在连接关闭后关闭语句会发生什么?

    什么都没有。他们已经关门了。这是记录在案的。

    语句会正确关闭

    是的。这是记录在案的。

    /将关闭连接关闭所有语句

    是的。这是记录在案的。

    关闭语句是多余的

    是的。

    语句是打开的,虽然连接返回到池中,但由于打开的语句而不能重用? (我们同时使用 Statement 和 PreparedStatement)。

    我无法确定这一点。如果连接关闭,则从它派生的StatementsResultSets 也将关闭。这是记录在案的。如果Connection 没有关闭,StatementsResultSets 也不会关闭,除非你关闭它们。

    您必须组织您的代码,这样您就不会在 Statement 的生命周期之外依赖 ResultSets,在 Connection 的生命周期之外依赖 Statement。这非常简单。

    【讨论】:

    • 这确实假设了一个正确实现的连接池,它将语句的生命周期限制为逻辑连接的生命周期。情况并非总是如此(出于性能目的或由于错误)。
    • @MarkRotteveel 它确实假设没有错误/不兼容的 JDBC 驱动程序/不可抗力/*不可抗力*/月相不正确,...
    • 没错,但是在看到足够多的损坏或故意不合规的连接池后,我认为这是一个重要的警告。
    • 好吧,我发现关闭连接而不关闭其关联的 Statements/ResultSet 会关闭 statements/resultsets 但服务器会发出警告“关闭关联的语句,请自己做家务”。但是我们在我们的应用程序中遇到了连接泄漏。所以我们无法确定这些连接是否可以重用。是否有任何方法或工具可以找出 Java 应用程序的连接泄漏?我使用 Oracle 10g 作为数据库。
    • @MarkRotteveel 我不认为任何连接池在一段时间后关闭语句。它仅在连接池级别的空闲超时指定的时间后关闭空闲连接(未附加到任何应用程序)。