我正在 Heroku 上运行 Web 服务并使用 New Relic 监控其性能。我使用 MySQL 和 Hibernate。我的非默认 c3p0 设置如下
hibernate.c3p0.maxStatementsPerConnection, 5
hibernate.c3p0.maxPoolSize, 35
hibernate.c3p0.minPoolSize, 5
hibernate.c3p0.initialPoolSize, 10
hibernate.c3p0.acquireIncrement, 10
对我的 Web 服务的每个请求都至少会访问数据库几次。在运行大约 200 个请求/分钟的负载测试 10 分钟后,我发现大部分时间都花在了
com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection
我猜它正在等待连接池中的连接?有趣的部分是随着我的增加
hibernate.c3p0.maxPoolSize, 40
性能更差(在同一个调用中等待时间更长getConnection
。在测试过程中,我可以看到c3p0
MySQL 服务器上确实打开了最大连接数(MySQL 端设置的最大连接数是300
,绝对没有耗尽)。
我所有的数据库函数都使用相同的格式
public void executeTransaction( Session session, IGenericQuery<T> query, T entity )
{
Transaction tx = null;
try
{
tx = session.beginTransaction();
query.execute( session, entity );
tx.commit();
}
catch ( RuntimeException e )
{
try
{
tx.rollback();
}
catch ( RuntimeException e2 )
{
}
throw e;
}
finally
{
if ( session != null )
{
session.close();
}
}
}
所以我确定所有会话都已关闭,这应该转化为连接关闭。为什么当我增加最大连接数时等待时间会更长?似乎性能从hibernate.c3p0.maxPoolSize, 25
to增加hibernate.c3p0.maxPoolSize, 30
,但在之后下降hibernate.c3p0.maxPoolSize, 35
。我的价值观离我们很远吗?
谢谢!