`
cuisuqiang
  • 浏览: 3937628 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
3feb66c0-2fb6-35ff-968a-5f5ec10ada43
Java研发技术指南
浏览量:3651913
社区版块
存档分类
最新评论

Hibernate的Session不会自动关闭

    博客分类:
  • SSH
阅读更多

做了一个SSH集成作为开发环境,Service层只是注入了sessionFactory,没有配置事务管理。

发现进行几次操作后就会当掉,但是Tomcat服务没有中断。

 

我首先鉴定是连接没有释放,可能是连接池太小吧,我设置大了仍然不管用。

我想着可能是因为连接是需要手动释放的,于是进行手动关闭来进行验证:

@Override
public int getResourceListCount() {
	int count = 0;
	Session session = this.getSession();
	String hql = "select count(*) from Resource u order by u.id desc";
	Query query = session.createQuery(hql);
	try {
		count = Integer.parseInt(query.uniqueResult().toString());
	} catch (Exception e) {
	}		
	session.close();
	return count;
}

 

将会话手动进行关闭,发现就没有问题了。

 

网上查了一下才知道,Hibernate的会话不会自动关闭,也就是sessionFactory每次创建一个session,如果你没有手动关闭,那么就会连接不释放!

 

毕竟是做集成,想到还没有配置Spring的事务管理,于是乎马上配置了一下,我采用的是代理方式:

<!-- 数据源 -->
<bean id="dataSource"
	class="org.apache.commons.dbcp.BasicDataSource"
	destroy-method="close">
	<property name="driverClassName" value="com.mysql.jdbc.Driver" />
	<property name="url"
		value="jdbc:mysql://192.168.0.244:3306/test?useUnicode=true&amp;characterEncoding=UTF-8" />
	<property name="username" value="root" />
	<property name="password" value="root" />
	<!-- 连接池启动时的初始值 -->
	<property name="initialSize" value="10" />
	<!-- 连接池的最大值 -->
	<property name="maxActive" value="10" />
	<!-- 最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止 -->
	<property name="maxIdle" value="20" />
	<!--  最小空闲值.当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请 -->
	<property name="minIdle" value="10" />
	<property name="defaultAutoCommit" value="true" />
</bean>
<!-- 会话工厂 -->
<bean id="sessionFactory"
	class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
	<property name="dataSource" ref="dataSource" />
	<property name="mappingLocations">
		<list>
			<value>classpath:/com/nms/entity/**/*.hbm.xml</value>
		</list>
	</property>
	<property name="hibernateProperties">
		<props>
			<prop key="hibernate.dialect">
				org.hibernate.dialect.MySQL5Dialect
			</prop>
			<prop key="hibernate.show_sql">true</prop>
			<prop key="hibernate.format_sql">true</prop>
		</props>
	</property>
</bean>    
   <!-- 事物管理器 -->
<bean id="transactionManager"
	class="org.springframework.orm.hibernate3.HibernateTransactionManager">
	<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<!-- 声明事物 -->
<bean id="base"
	class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
	abstract="true">
	<property name="transactionManager" ref="transactionManager">
	</property>
	<property name="transactionAttributes">
		<props>
			<prop key="*">PROPAGATION_REQUIRED</prop>
		</props>
	</property>
</bean>

 

事务均采用PROPAGATION_REQUIRED

 

然后每个服务类都配置一个代理对象:

<bean id="userDao" class="com.nms.service.common.impl.UserDaoImpl">
	<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- 代理类 -->
<bean id="userDaoAgency" parent="base">
	<property name="target" ref="userDao"></property>
</bean>	

 

在配置Struts2的Action时需要服务类都是用代理对象:

<bean id="userAction" class="com.nms.action.common.UserAction" scope="prototype">
	<property name="userDao" ref="userDaoAgency"></property>
	<property name="jdbcRoleDao" ref="jdbcRoleDao"></property>
</bean>

 

这样,每次操作都在不同的事务中,一个事务结束就会由Spring来处理这个已经结束的会话。

 

但是还有一个问题,在服务层你的会话结束了,但是在前台可能使用是一个Hibernate代理对象,就是说没有实际去查询数据,这就需要你的对象不能进行懒加载。

<class name="User" table="common_user" lazy="false">

 

查询时在服务层直接把对象查询出来,不然你到JSP页面去取值时会报错

org.hibernate.LazyInitializationException: could not initialize proxy - no Session

 

当然我这只是简单配置下做个测试,对于Spring的事务配置那是有很多种方式的,回头我再总结一下给大家分享!

 

请您到ITEYE看我的原创:http://cuisuqiang.iteye.com

或支持我的个人博客,地址:http://www.javacui.com

 

分享到:
评论
2 楼 cuisuqiang 2013-01-14  
denis 写道
穿越了?怎么无意中点到这里,还看到一篇类似于5年前的文章?

只能说,你老了
1 楼 denis 2013-01-14  
穿越了?怎么无意中点到这里,还看到一篇类似于5年前的文章?

相关推荐

    Hibernate3.1_学习源码

    01 01Hibernate_Handwork : 手工配置使用Hibernate,其中详细标了Hibernate进行持久化的一些过程,因为是Hibernate的入门实例,所以注释很详细,其中有session的关闭后重建问题。 02 02Hibernate_UseMyEclipse: 利用...

    hibernate 教程

    关闭Session 9.7.4. 处理异常 9.8. 生命周期和对象图(Lifecyles and object graphs) 9.9. 拦截器(Interceptors) 9.10. 元数据(Metadata) API 10. 事务和并行(Transactions And Concurrency) ...

    第24次课-1 Spring与Hibernate的整合

    有效的Session管理:Spring提供了有效、简单、安全的Hibernate Session处理。 IoC容器降低了DAO组件与业务逻辑层之间的耦合性。 DAO模式的使用,降低了系统重构的代价。 方便的事务管理:Spring提供的声明式事务处理...

    Hibernate使用技巧汇总

    session.Flush() 强制数据库立即同步,当用事务时,不必用flush,事务提交自动调用flush 在session关闭时也会调用flush &lt;br&gt;4. Hibernate总是使用对象类型作为字段类型 5. XDoclet专门建立了...

    Hibernate_二级缓存总结

    即每个 Session 有自己的一个 CACHE, 当前操作的对象都会被保留在 CACHE 中 . 但是 Session 关闭后这个 CACHE 也就没有 . 可见这级 CACHE 的生命期是很短的 . (使用 id 进行关键字存储:缓存的 key 就是 ID , ...

    hibernate

    关闭Session 9.7.4. 处理异常 9.8. 生命周期和对象图(Lifecyles and object graphs) 9.9. 拦截器(Interceptors) 9.10. 元数据(Metadata) API 10. 事务和并行(Transactions And Concurrency) ...

    SpringBoot2 整合Ehcache组件,轻量级缓存管理.docx

    Session关闭后会自动清除缓存。 二级缓存 :是SessionFactory对象缓存,可以被创建出的多个 Session 对象共享,二级缓存默认是关闭的,如果要使用需要手动开启,并且依赖EhCache组件。 三级缓存 :查询缓存,配置...

    SSH的jar包.rar

    8.关闭Session 9.关闭SesstionFactory Struts2使用Filter嵌入自己的框架。配置文件加载顺序为:default.properties -&gt; struts-default.xml -&gt; struts-plugins.xml -&gt; struts.xml -&gt; struts.locale。

    ACCP8.0北大青鸟SSH10章上机

    Configuration configuration = new ...或者通过MyEclipse的Hibernate工具自动生成的HibernateSessionFactory.getSession()方法来获取Session,调用HibernateSessionFactory. closeSession()方法来关闭session。

    NHibernate Demo

    2.增加httpmodule自动关闭功能, Application_EndRequest 处理过程中关闭所有打开连接 3.程式中使用只需要打开连接,不需要关闭 4.ISession session = NHibernateHelper.GetSession("HR"); 带参数的需要在Config中...

    MF00617-JAVA餐厅点餐管理源码.zip

    登陆jsp采用jquery.cooki.js脚本在项目根目录下生成cookie,用来控制一个浏览器只能登陆一个用户,用户退出时清空cookie,关闭浏览器cookie自动清空,用户非正常退出下,需等待20分的session失效时间后方可正常登陆...

    jdbc基础和参考

    hibernate不在自动生成主键值,需要你在插入时自己指明 3.hilo:高低值算法,由数据库表提供高值,程序提供低值 value = hi*(max_lo+1)+lo 4.sequences Cat: cid name color weight age ------------------------...

    Spring的学习笔记

    一、 Jsp中访问Session时,Session已经关闭 43 二、 如果不配置事务,openSessionView出现异常 44 三、 中文乱码问题: 44 第十三课:SSH整合的jar包 45 一、 Struts2 45 二、 Hibernate3.3.2 45 三、 Spring 46

    spring2.5 学习笔记

    一、 Jsp中访问Session时,Session已经关闭 43 二、 如果不配置事务,openSessionView出现异常 44 三、 中文乱码问题: 44 第十三课:SSH整合的jar包 45 一、 Struts2 45 二、 Hibernate3.3.2 45 三、 Spring 46

    JAVA程序开发大全---上半部分

    7.2.4 关闭数据库连接 108 7.2.5 浏览数据库结构 109 7.2.6 编辑和执行SQL语句 110 7.2.7 生成实体关系图 111 7.2.8 编辑和清除数据表中的数据 112 7.2.9 创建和删除数据表 112 7.2.10 创建和删除外键 113 7.2.11 ...

    java面试题

    6:关闭Session 7:关闭SessionFactory Hibernate持久化:Hibernate根据定义的映射规则将对象持久化保存到数据库,这就实现了对象的持久化。 Spring由那几个模块组成? 答:Spring主要由7个模块组成: 1:Spring...

    Spring面试题

    7.关闭Session 8.关闭SesstionFactory 为什么要用: 1. 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。 2. Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度...

    springmybatis

    4. 在用完之后关闭session 。 5. 在java 对象和 数据库之间有做mapping 的配置文件,也通常是xml 文件。 mybatis实战教程(mybatis in action)之一:开发环境搭建 mybatis 的开发环境搭建,选择: eclipse j2ee 版本,...

    JAVA上百实例源码以及开源项目

     通过网络或磁盘等方式,把公钥编码传送给李四,李四接收到张三编码后的公钥,将其解码,李四用张三的公钥加密信息,并发送给李四,张三用自己的私钥解密从李四处收到的信息…… Java利用DES私钥对称加密代码实例 ...

    JAVA上百实例源码以及开源项目源代码

     通过网络或磁盘等方式,把公钥编码传送给李四,李四接收到张三编码后的公钥,将其解码,李四用张三的公钥加密信息,并发送给李四,张三用自己的私钥解密从李四处收到的信息…… Java利用DES私钥对称加密代码实例 ...

Global site tag (gtag.js) - Google Analytics