簡體   English   中英

一段時間后失去與MySQL的連接,而不是重新連接

[英]Losing connection to MySQL after a while, and not reconnecting

我正在開發一個使用JPA + Hibernate訪問MySQL數據庫的獨立服務器。

當我啟動服務器時,一切正常。 然而,過了一段時間(通常是第二天早上,如果我在下午開始),它將停止工作,因為顯然與MySQL的連接已關閉(我在日志中看到很多SocketException )。 這可能是由於空閑,服務器正在開發而沒有人在晚上使用它。

我認為Hibernate,JDBC或我應用程序下面的其他一些層將管理連接並在必要時重新打開它,但顯然不是。 我錯過了配置參數嗎?

persistence.xml

http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd“version =”2.0“>

<persistence-unit name="manager">

<class>example.data.entities.User</class>
<class>example.data.entities.Player</class>

<properties>
    <property name="hibernate.dialect" value="example.data.HibernateDialect" />
    <property name="hibernate.max_fetch_depth" value="3" />
    <property name="hibernate.hbm2ddl.auto" value="update" />

    <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />

</properties>

</persistence-unit>

EntityManagerFactory創建

    log.info("Connecting to database @ " + dbUrl + " using " + dbUser + "/" + dbPass);

    emf = Persistence.createEntityManagerFactory("manager", Maps.create(
            "javax.persistence.jdbc.user", dbUser,
            "javax.persistence.jdbc.password", dbPass,
            "javax.persistence.jdbc.url", dbUrl
    ));

一個問題

            try
            {

                TypedQuery<User> q = em.createQuery("SELECT u FROM User u WHERE u.email = :mail", User.class);
                q.setParameter("mail", email);
                try {
                    u = q.getSingleResult();
                    log.info("Authenticating: " + u);
                } catch (NoResultException e) {
                    return false;
                }

            } finally {
                em.close();
            }

正如你的建議,這是因為mysql在每次wait_timeout通過后關閉空閑連接; 你有一些選擇來解決你的問題:

  • 使用連接池管理器,如c3p0apache DBCP 這將根據請求重新驗證連接,最終您可以指定運行哪個查詢來測試連接是否處於活動狀態。
  • 在mysql中設置wait_timeout足夠大的用例(默認為8小時)。
  • 設置一個計划任務(例如使用quartz )刷新連接,“ping”mysql服務器。

mysql驅動支持autoReconnect jdbc url看起來像jdbc:mysql:// localhost / bms_company?autoReconnect = true

如果你懷疑mysql正在丟棄連接嘗試在MySQL的my.ini文件末尾添加以下條目。 該文件位於MySQL安裝的根文件夾中。

#在響應“Bad handshake”connect_timeout = 0之前,mysqld服務器等待連接數據包的秒數

#服務器在關閉之前等待交互式連接上的活動的秒數。 interactive_timeout = 2000000

#服務器在關閉連接之前等待連接活動的秒數wait_timeout = 2000000

--Kiran.Kumar

暫無
暫無

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

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