Hibernate sessionFactory是否只创建了一次的问题
hunterbin
2009-03-27
最近在做一个Ext + Strust2 + spring + hibernate的系统时遇到了一个Hibernate访问数据库内存不释放,导致服务器内存溢出的问题。每当我调用了hibernate读取数据库 10次左右就出现java.lang.OutOfMemoryError: Java heap space的错误,我用的是服务器是tomcat6.0,虽然增加tomcat的内存可以暂时解决这个问题,但是我观察内存占用发现个问题,只要我一调用 hibernate,内存就增加一次,而且内存不会释放,随着我调用hibernate的次数内存占用在持续增长,是不是我的Dao没有正确释放资源,或者我的sessionFactory配置有问题
我的Dao是这样写的 package com.oa.dao.impl; import java.util.List; import org.hibernate.SessionFactory; import org.springframework.beans.factory.BeanFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; import com.oa.bean.Department; import com.oa.bean.User; import com.oa.dao.DepartmentDao; public class DepartmentDaoImpl extends HibernateDaoSupport implements DepartmentDao { public List<User> findUserByDepartment(String depName) { List<User> users = this.getHibernateTemplate().find("from User user where user.department.name = ?" , depName); return users; } public void save(Department dep) { this.getHibernateTemplate().save(dep); } public List<Department> findAllDeps() { List<Department> deps = this.getHibernateTemplate().find("from Department dep"); return deps; } } sessionFactory是交给spriing管理的 <!-- sessionFactory的配置--> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean" scope="singleton"> <property name="configLocations"> <value>classpath:hibernate.cfg.xml</value> </property> </bean> <!-- 事务配置--> <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"/> </bean> <!-- 把sessionFactory注入Dao-> <bean id="depDao" class="com.oa.dao.impl.DepartmentDaoImpl"> <property name="sessionFactory" ref="sessionFactory"/> </bean> hibernate的配置文件 <property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/oa</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">123456</property> <property name="hibernate.current_session_context_class">thread</property> <property name="hibernate.connection.release_mode">after_transaction</property> <property name="hibernate.hbm2ddl.auto">update</property> [align=center][/align] 我的事务是交给spring管理的,按理说我Dao里每次使用完find()方法后,session应该是关闭的,但我测试发现session在find()方法后仍然是开着的,我只好手动关闭session了,但这样还是解决不了内存一直增加的问题。 我想原因是不是因为sessionFactory每次访问数据库都创建?但我明明在spring里配置了singleton,应该只是创建了一个sessionFactory的。 我想问的是 1.如何测试我的sessionFactory是不是只创建了一次? 2.为什么每次使用完find()方法后session依样开着的? 3.我的程序里是不是还有哪些资源没有正确释放? 大家帮我看看,问题困扰我几天了,也尝试了网上的许多方法,但问题依样解决不了。或者有好心人+我QQ254968537帮我解答下,不胜感激 |
|
liuwenbo200285
2009-03-28
按我的理解,使用 this.getHibernateTemplate().find()这个方法,sping会帮你把session关闭的,这就是使用HibernateTemplate的好处。
|
|
hunterbin
2009-04-02
是的,我也认为HibernateTemplate是自动帮我关闭session的,但我用session.isOpen()方法检测却是开着的,另外我用sessionFactory.hashCode()得到sessionFactory的hashcode每次都不同,是不是我的singleton没起作用呢?
|
|
treblesoftware
2009-04-15
你的HIBERNATE事物呢????
用SPRING的AOP去配置HIBERNATE session的事物。 |
|
hunterbin
2009-04-17
我的AOP事物也是配置好的,我最近发现应该是我项目用了jbpm这个工作流引擎的问题,我把jbpm的heibernate配置加进去后数据库访问就出现这种非常吃内存的问题,只要我把jbpm的配置删掉访问就没有问题,不知道是不是jbpm有东西我没配置好或者存在bug。问题就到此结束吧,如果有好解决办法的朋友可以联系我哦,我的邮箱是hunter_wjb@126.com,随时恭候高手的指点
|
|
wjx
2009-09-03
我也遇到类似情况,oracle游标很多没有能够释放,也是sping管理的事物,不知lz如何解决这个问题的?
|