我正在开发一个使用JPA + Hibernate访问MySQL数据库的独立服务器。
当我启动服务器时,一切正常。但是,过了一段时间(通常是第二天早上,如果我在下午开始),它将停止工作,因为显然与MySQL的连接已关闭(我在日志中看到了很多SocketException
个)。这可能是由空闲引起的,服务器正在开发中,没有人在晚上使用它。
我认为Hibernate,JDBC或我应用程序下面的其他一些层会管理连接并在必要时重新打开它,但显然不是。我错过了配置参数吗?
persistence.xml
http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd” 版本= “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();
}
答案 0 :(得分:7)
正如您所说,这是因为mysql在每次wait_timeout
次传递后关闭空闲连接;你有一些解决问题的方法:
wait_timeout
足够大的用例(默认为8小时)。答案 1 :(得分:4)
mysql驱动支持autoReconnect jdbc网址看起来像 JDBC:MySQL的://本地主机/ bms_company autoReconnect的=真
如果你怀疑mysql正在丢弃连接 尝试在MySQL的my.ini文件末尾添加以下条目。这个文件 位于MySQL安装的根文件夹中。
#mysqld服务器等待连接数据包的秒数 在回答“坏握手”之前 connect_timeout = 0
#服务器等待交互式活动的秒数 关闭之前的连接。 interactive_timeout = 2000000
#服务器之前等待连接活动的秒数 关闭它 wait_timeout = 2000000
- Kiran.Kumar