簡體   English   中英

Hibernate / C3P0無法正確關閉MySQL連接(mysql.err上的異常終止連接)

[英]Hibernate/C3P0 not closing MySQL connections properly (Aborted connections on mysql.err)

我有一個使用Hibernate來管理SQL連接的獨立Java應用程序。 我使用MySQL數據庫,並確保在main()方法退出時關閉所有會話。

我的代碼是這樣的:

public static void main(String[] args) {

    logger.info("Starting app");
    App instance = new App();
    try {
        instance.run();
    } catch (Exception e) {
        logger.error("failed to complete run", e);
    } finally {
        HibernateUtil.closeCurrentSession();
    }
    logger.info("Finished run");
}

現在,每當這個主要方法退出時,我都會在sql錯誤日志中看到一條日志: [Warning] Aborted connection 41533470 to db: 'user' user: 'some_user' host: 'some_ip_address_here' (Got an error reading communication packets)

這是否意味着MySQL手動將其殺死? 如果是這樣,如何正常關閉MySQL連接? 如果我可以正確地回憶起我的Hibernate,則關閉會話只是將它們放回會話池中……我不確定如何完全告訴Hibernate釋放其與MySQL的連接。

編輯:我正在為此使用C3P0-對不起,忘記提起。 我的連接確實關閉了,但是僅僅是我的mysql.err日志上出現了[警告]錯誤。 我不喜歡看到這些類型的警告,因為顯然存在問題。

顯然,這實際上是Hibernate的一個錯誤。

我添加了另一個方法,該方法也可以關閉HibernateUtil中的C3P0ConnectionProvider以進行靜態訪問。

SessionFactoryImpl impl = (SessionFactoryImpl) sessionFactory;
C3P0ConnectionProvider provider = (C3P0ConnectionProvider) impl.getConnectionProvider();
provider.close();

在那之后,我再也沒有看到那些討厭的警告。

您可以在代碼中的run()方法中控制Hibernate會話。

有關示例,請參見Session javadoc。 如果您使用Google,Hibernate會話控件可能還有許多其他示例。

如果對HibernateUtil.closeCurrentSession()的調用曾經做過任何事情,則您的run()方法在run()完之后無法正確清除。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM