我正在开发使用JPA + Hibernate访问MySQL数据库的独立服务器。
当我启动服务器时,一切正常。但是,经过一段时间(通常是第二天早上,如果我在下午开始),它将停止工作,因为与MySQL的连接显然已关闭(我SocketException在日志中看到很多s)。这可能是由于闲置造成的,服务器正在开发中,晚上没有人使用它。
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 创建
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传递之后都会关闭空闲连接;这是因为 您有一些解决方案来解决您的问题:
wait_timeout