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如何解决这个问题的?
Global site tag (gtag.js) - Google Analytics