我在使用休眠时遇到了一种奇怪的行为。我有一个使用 hibernate 和 spring 的 java web 应用程序,使用 MySQL 数据库。
症状:使用以下方法检查我的 sql 上的连接会话:
show processlist;
我可以看到在我的数据源配置中定义的连接数量,但是随着时间的推移,它们的 ID 正在发生变化,这让我相信连接正在关闭然后重新连接。即使没有流量,也会发生此行为。
我希望池连接将其 ID 保留在数据库中。
配置:
<bean id="DataSource"
class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
<property name="maxWait" value="10" />
<property name="maxIdle" value="5" />
<property name="maxActive" value="0" />
<property name="validationQuery" value="SELECT 1"/>
<property name="testOnBorrow" value="true" />
<property name="testOnReturn" value="true"/>
<property name="testWhileIdle" value="true"/>
<property name="timeBetweenEvictionRunsMillis" value="10000"/>
<property name="minEvictableIdleTimeMillis" value="60000"/>
</bean>
<bean id="SessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="DataSource"></property>
<property name="mappingResources">
<list>
<value>
data/entities/entity.hbm.xml
</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</prop>
</props>
</property>
</bean>
<bean id="entityDaoImpl" class="data.dao.EntityDaoImpl">
<property name="sessionFactory" ref="SessionFactory" />
</bean>
<bean id="SessionFactory2"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="DataSource"></property>
<property name="mappingResources">
<list>
<value>
data/entities/entity2.hbm.xml
</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</prop>
</props>
</property>
</bean>
<bean id="entity2DaoImpl" class="data.dao.Entity2DaoImpl">
<property name="sessionFactory" ref="SessionFactory2" />
</bean>
我的猜测是,这可能与 2 个不同的会话工厂使用相同的数据源这一事实有关,但我相信我错过了一些更深入的理解(或者是对的,但不知道为什么,或者完全错了)
我还要补充一点,我使用在 tomcat 6 上运行的 spring 2.5 和 Hibernate 3.1.1。我注意到在很多地方人们不鼓励使用 hibernateTemplate,但代码正在使用它。
编辑:
我打开了审核,试图弄清楚连接在做什么,我专注于我看到的一个自行关闭的连接:
130806 10:58:43 13 Connect user@localhost on database
130806 10:58:43 13 Query SET NAMES hebrew
130806 10:58:43 13 Query SET character_set_results = NULL
130806 10:58:43 13 Query SHOW VARIABLES
130806 10:58:43 13 Query SHOW COLLATION
130806 10:58:43 13 Query SET autocommit=1
130806 10:58:43 13 Query SET sql_mode='STRICT_TRANS_TABLES'
130806 10:58:43 13 Query SELECT 1
130806 10:58:43 13 Query SET autocommit=1
130806 10:58:54 13 Query SET autocommit=1
130806 10:58:54 13 Query SELECT 1
130806 10:58:54 13 Query SET autocommit=1
130806 10:59:25 13 Query SET autocommit=1
130806 10:59:25 13 Query SELECT 1
130806 10:59:25 13 Query SET autocommit=1
130806 11:00:27 13 Quit
至于我的理解,这表明问题不在数据库方面,因为他得到了 Quit 命令。所以我再次想知道我的数据源配置中是否缺少一些keepAlive配置?
谢谢