java MySQL 连接和休眠 c3p0 设置,8 小时后超时?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/14978617/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
MySQL connection and hibernate c3p0 settings, timeout after 8 hours?
提问by TuomasSaranen
I am using Amazon EC2 to run my Java Wicket app and I have Amazon MySQL instance running for the application. All works fine, but after 8 hours my database connection is lost. I have tried to configure c3p0 settings so that this would not happen. I have also tried to update MySQL settings, but no help.
我正在使用 Amazon EC2 运行我的 Java Wicket 应用程序,并且我为该应用程序运行了 Amazon MySQL 实例。一切正常,但 8 小时后我的数据库连接丢失。我已尝试配置 c3p0 设置,以免发生这种情况。我也尝试过更新 MySQL 设置,但没有帮助。
Here is my persitence.xml
这是我的 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>
I am making queries like this:
我正在做这样的查询:
@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;
}
}
All help would be appreciated.
所有帮助将不胜感激。
回答by Steve Waldman
First, you might want to check your logs for c3p0's dump of its config; your 5-minute timeout should prevent the MySQL connections from going stale after 8 hours, but for some reason that seems not to be happening for you. You want to see if the c3p0 property 'maxIdleTime' is actually 300 as expected. Anyway, you might try adding
首先,您可能需要检查您的日志以获取 c3p0 的配置转储;您的 5 分钟超时应该可以防止 MySQL 连接在 8 小时后失效,但出于某种原因,这似乎不会发生在您身上。您想查看 c3p0 属性 'maxIdleTime' 是否实际上是预期的 300。无论如何,您可以尝试添加
hibernate.c3p0.preferredTestQuery=SELECT 1
hibernate.c3p0.testConnectionOnCheckout=true
this is the simplest way to ensure the validity of Connections -- test them (with an efficient query) on every checkout. it is also relatively expensive; if you find that's a problem, you can go to something savvier. But it'd be good to make sure you can get a reliable set-up, and then optimize from there. See here.
这是确保连接有效性的最简单方法——在每次结帐时测试它们(使用有效的查询)。它也相对昂贵;如果你发现这是一个问题,你可以去一些更精明的地方。但是最好确保您可以获得可靠的设置,然后从那里进行优化。见这里。
Note that your hibernate.c3p0.idle_test_period=3000
is not useful, if your pool is configured as you think it is. Idle connections will be timed out long before the 3000-second test interval has passed.
请注意hibernate.c3p0.idle_test_period=3000
,如果您的池配置为您认为的那样,则您的没用。空闲连接将在 3000 秒测试间隔结束之前超时。