一段时间后失去与MySQL的连接,而不是重新连接

Bar*_*lom 2 java mysql hibernate jpa jdbc

我正在开发一个使用JPA + Hibernate访问MySQL数据库的独立服务器.

当我启动服务器时,一切正常.然而,过了一段时间(通常是第二天早上,如果我在下午开始),它将停止工作,因为显然与MySQL的连接已关闭(我SocketException在日志中看到很多s).这可能是由于空闲,服务器正在开发而没有人在晚上使用它.

我认为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>
Run Code Online (Sandbox Code Playgroud)

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
    ));
Run Code Online (Sandbox Code Playgroud)

一个问题

            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();
            }
Run Code Online (Sandbox Code Playgroud)

gui*_*ido 7

正如你的建议,这是因为mysql在每次wait_timeout传递后关闭空闲连接; 你有一些选择来解决你的问题:

  • 使用连接池管理器,如c3p0apache DBCP.这将根据请求重新验证连接,最终您可以指定运行哪个查询来测试连接是否处于活动状态.
  • wait_timeout在mysql中设置足够大的用例(默认为8小时).
  • 设置一个计划任务(例如使用quartz)刷新连接,"ping"mysql服务器.