我體驗了一種使用hibernate的奇怪行爲。 我有一個使用hibernate和spring的java web應用程序,使用MySQL數據庫。Hibernate池似乎釋放連接
症狀: 通過期運用檢查我的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個不同的會話工廠都使用相同的數據源,但我相信我錯過了一些更深入的瞭解(或者是權不知道爲什麼,或者完全錯誤)
我將補充說我使用spring 2.5和運行在tomcat 6上的Hibernate 3.1.1。 我注意到許多地方人們不鼓勵使用hibernateTemplate,但代碼使用它。
編輯:
我打開了審計,試圖弄清楚哪些連接正在做的和我專注於一個我看到的是由自我封閉:
130806 10:58:43 13 Connect [email protected] 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配置?
感謝
所以它不會影響我的應用程序? 是wait_timeout是mysql的配置嗎? 是否有一個數據源有多個會話工廠的問題? –
這是MySQL的正常行爲。是的,'my.cnf'中設置了'wait_timeout'。 –
我檢查my.cnf,看到我使用wait_timeout的默認值。這是28800秒,並且我看到了ID在幾秒鐘內的變化,所以這似乎不是問題。 –