確定這裏是我所經歷的昨天:
我的測試(由硒運行)登錄到我的應用程序,並從數據庫加載數據,從而創建一個Hibernate會話。然後它退出。這是每3分鐘完成一次。
的持久性豆由Spring創建如下:
<bean scope="session"
id="persistanceService"
class="com.a.b.c.PersistanceServiceImpl"
p:entityManagerFactory-ref="entityManagerFactory" />
實體管理器工廠配置如下:
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
p:dataSource-ref="dataSource" p:persistenceUnitName="jpa" >
<property name="jpaVendorAdapter">
<bean
class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"
p:database="ORACLE"
p:databasePlatform="org.hibernate.dialect.Oracle9iDialect"
p:showSql="false" />
</property>
<property name="jpaProperties">
<props>
<prop key="hibernate.hbm2ddl.auto">validate</prop>
</props>
</property>
</bean>
我跑的測試,創造了每30分鐘一個線程轉儲,即每10次登錄/註銷。
如果聽衆是而不是集,我可以看到每次登錄和註銷時會話實例都會加起來。會話超時設置爲30分鐘,我可以在日誌中看到會話已失效,因此我預計會話數量在此之後會減少,但仍會增加。 1小時30分鐘後的會話次數爲30次,之後繼續上升。
如果偵聽器已設置,則會話實例數保持較低。實際上,它說因爲一旦測試註銷,http會話失效實際上使休眠會話無效,並且所有事情都是GC。過去15個小時一直如此。
鑑於這一切,我認爲缺少此監聽器很可能導致內存泄漏...
Bozho:你覺得這是什麼?順便說一句,我不是一個有經驗的SO用戶:我是否應該在我的問題中發佈這條消息?我認爲我在這裏回答我自己的問題,所以我添加了一個答案,但不知道:-)
嗨,感謝您的幫助:)會話可以由事務管理器關閉,但SessionImpl實例仍然保留由Spring bean? Spring使用一個EntityManager配置我的持久性bean,並且該bean沒有被正確銷燬,所以EntityManager留在內存中,並且會話實例也一樣... – 2010-04-27 13:59:17
我不知道,我計劃在附近進行調試未來,並深入到問題的底部。我會告訴你。 – Bozho 2010-04-27 14:03:45
謝謝。我要進一步挖掘,如果我找到某些東西,請更新此頁面...... – 2010-04-27 14:14:32