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秒的测试间隔过去之前,空闲连接将会很长时间。

+0

我对配置做了一些更改,现在我们等待并希望最好。监视显示,hibernate.c3p0.min_size = 5已生效,仅在1之前。监控图像:http://oi49.tinypic.com/35hipee.jpg – TuomasSaranen 2013-02-22 08:21:04

+0

嗨史蒂夫,你可以看看我最近的问题,它有点相关:http://*.com/questions/19664878/configure-c3p0关闭休眠会话时,连接是关闭?谢谢 – amphibient 2013-10-29 20:43:46