MySQL连接和休眠c3p0设置,8小时后超时?
问题描述:
我正在使用Amazon EC2来运行我的Java Wicket应用程序,并且我已经为应用程序运行了Amazon MySQL实例。所有的工作正常,但8小时后,我的数据库连接丢失。我试图配置c3p0设置,以免发生这种情况。我也尝试更新MySQL设置,但没有帮助。MySQL连接和休眠c3p0设置,8小时后超时?
这里是我的persitence.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<persistence xmlns="xyz">
<persistence-unit name="mysqldb-ds" transaction-type="RESOURCE_LOCAL">
<description>Persistence Unit</description>
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<properties>
<property name="hibernate.hbm2ddl.auto" value="update"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
<property name="hibernate.connection.username" value="XXXXX"/>
<property name="hibernate.connection.password" value="YYYYY"/>
<property name="hibernate.connection.url" value="jdbc:mysql://xxxx.yyyyy.us-east-1.rds.amazonaws.com:3306/paaluttaja"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
<property name="connection.pool_size" value="1" />
<property name="cache.provider_class" value="org.hibernate.cache.NoCacheProvider" />
<property name="hibernate.c3p0.min_size" value="5" />
<property name="hibernate.c3p0.max_size" value="20" />
<property name="hibernate.c3p0.timeout" value="300" />
<property name="hibernate.c3p0.max_statements" value="50" />
<property name="hibernate.c3p0.idle_test_period" value="3000" />
</properties>
</persistence-unit>
</persistence>
我提出疑问是这样的:
@Service
public class LoginServiceImpl implements LoginService{
@Override
public Customer login(String username, String password) throws LSGeneralException {
EntityManager em = EntityManagerUtil.getEm();
TypedQuery<Customer> query = em.createQuery("SELECT c FROM Customer c "
+ "WHERE c.username = '" + username + "' "
+ "AND c.password = '" + password + "'", Customer.class);
Customer customer = null;
try {
customer = (Customer) query.getSingleResult();
}catch(Exception e){
if(e instanceof NoResultException){
throw new LSGeneralException("login.failed.wrong.credentials", e);
}else{
throw new LSGeneralException("failure", e);
}
}
customer.setLogged(true);
return customer;
}
}
所有帮助将不胜感激。
答
首先,你可能想检查你的日志c3p0的配置转储;您的5分钟超时应该可以防止MySQL连接在8小时后过时,但出于某种原因,这似乎不会发生在您身上。您希望查看c3p0属性“maxIdleTime”是否按预期实际为300。无论如何,你可以尝试添加
hibernate.c3p0.preferredTestQuery=SELECT 1
hibernate.c3p0.testConnectionOnCheckout=true
这是为了保证连接的有效性,最简单的方法 - 测试它们(与高效的查询),每个结账。它也相对昂贵;如果你发现这是一个问题,你可以去一些精明的事情。但确保您可以获得可靠的设置,然后从那里进行优化是一件好事。 See here。
请注意,您的hibernate.c3p0.idle_test_period=3000
不适用,如果您的池配置为您认为的那样。在3000秒的测试间隔过去之前,空闲连接将会很长时间。
我对配置做了一些更改,现在我们等待并希望最好。监视显示,hibernate.c3p0.min_size = 5已生效,仅在1之前。监控图像:http://oi49.tinypic.com/35hipee.jpg – TuomasSaranen 2013-02-22 08:21:04
嗨史蒂夫,你可以看看我最近的问题,它有点相关:http://stackoverflow.com/questions/19664878/configure-c3p0关闭休眠会话时,连接是关闭?谢谢 – amphibient 2013-10-29 20:43:46