【发布时间】:2009-04-11 15:09:25
【问题描述】:
我们托管一个服务(在 jboss 上运行的 servlet),它每秒接收大约 5-6 个请求。每个请求都需要通过hibernate连接到mysql。我们的大多数请求都进行选择,每 5/6 个请求插入/更新一次。休眠 mysql 连接在 mysql 连接超时期限(8 小时)后超时。即使在请求 ping 我们的服务之后,每隔一小时,mysql 连接有时也会在一天左右后随机断开。我们希望 hibernate 在连接因任何原因断开连接的情况下重新连接,并保持我们希望的连接数。
我们尝试了 C3P0,配置如下:
<property name=c3p0.acquire_increment>1</property>
<property name=c3p0.idle_test_period>3600</property>
<property name=c3p0.max_statements>0</property>
<property name=c3p0.min_size>1</property>
<property name=c3p0.timeout>3605</property>
<property name=hibernate.c3p0.preferredTestQuery>select 1;</property>
休眠连接池大小设置为 1。
这使超时/断开连接问题消失了。但我们开始面临另一个问题。漫长的等待。通常我们的请求服务时间是 2-3ms 的选择和 40-50ms 的插入/更新。但是,在使用上述 C3P0 配置后,我们看到更新后完成的每个请求都需要一分钟以上,有时甚至需要 4-5 分钟!从我们的日志来看,似乎随机选择请求会卡住,并且只有在收到并提供更新请求后才能完成。
如果我们删除 C3P0 配置,上述问题就会消失。有人可以建议我们可能做错了什么吗?
这是完整的休眠配置供参考:
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://xxx.xxx.xxx</property>
<property name="connection.username">xxx</property>
<property name="connection.password">xxx</property>
<property name="connection.pool_size">1</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="current_session_context_class">thread</property>
<property name="hibernate.cache.use_query_cache">false</property>
<property name="hibernate.cache.use_second_level_cache">false</property>
<property name="show_sql">true</property>
<!-- Transaction isolation 2 = READ_COMMITTED -->
<property name="connection.isolation">2</property>
<property name="connection.autocommit">true</property>
<!-- configuration pool via c3p0-->
<property name="c3p0.acquire_increment">1</property>
<property name="c3p0.idle_test_period">3600</property> <!-- seconds -->
<property name="c3p0.max_size">1</property>
<property name="c3p0.max_statements">0</property>
<property name="c3p0.min_size">1</property>
<property name="c3p0.timeout">3605</property> <!-- seconds -->
<property name="hibernate.c3p0.preferredTestQuery">select 1;</property>
</session-factory>
</hibernate-configuration>
【问题讨论】: