做了一个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&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
相关推荐
01 01Hibernate_Handwork : 手工配置使用Hibernate,其中详细标了Hibernate进行持久化的一些过程,因为是Hibernate的入门实例,所以注释很详细,其中有session的关闭后重建问题。 02 02Hibernate_UseMyEclipse: 利用...
关闭Session 9.7.4. 处理异常 9.8. 生命周期和对象图(Lifecyles and object graphs) 9.9. 拦截器(Interceptors) 9.10. 元数据(Metadata) API 10. 事务和并行(Transactions And Concurrency) ...
有效的Session管理:Spring提供了有效、简单、安全的Hibernate Session处理。 IoC容器降低了DAO组件与业务逻辑层之间的耦合性。 DAO模式的使用,降低了系统重构的代价。 方便的事务管理:Spring提供的声明式事务处理...
session.Flush() 强制数据库立即同步,当用事务时,不必用flush,事务提交自动调用flush 在session关闭时也会调用flush <br>4. Hibernate总是使用对象类型作为字段类型 5. XDoclet专门建立了...
即每个 Session 有自己的一个 CACHE, 当前操作的对象都会被保留在 CACHE 中 . 但是 Session 关闭后这个 CACHE 也就没有 . 可见这级 CACHE 的生命期是很短的 . (使用 id 进行关键字存储:缓存的 key 就是 ID , ...
关闭Session 9.7.4. 处理异常 9.8. 生命周期和对象图(Lifecyles and object graphs) 9.9. 拦截器(Interceptors) 9.10. 元数据(Metadata) API 10. 事务和并行(Transactions And Concurrency) ...
Session关闭后会自动清除缓存。 二级缓存 :是SessionFactory对象缓存,可以被创建出的多个 Session 对象共享,二级缓存默认是关闭的,如果要使用需要手动开启,并且依赖EhCache组件。 三级缓存 :查询缓存,配置...
8.关闭Session 9.关闭SesstionFactory Struts2使用Filter嵌入自己的框架。配置文件加载顺序为:default.properties -> struts-default.xml -> struts-plugins.xml -> struts.xml -> struts.locale。
Configuration configuration = new ...或者通过MyEclipse的Hibernate工具自动生成的HibernateSessionFactory.getSession()方法来获取Session,调用HibernateSessionFactory. closeSession()方法来关闭session。
2.增加httpmodule自动关闭功能, Application_EndRequest 处理过程中关闭所有打开连接 3.程式中使用只需要打开连接,不需要关闭 4.ISession session = NHibernateHelper.GetSession("HR"); 带参数的需要在Config中...
登陆jsp采用jquery.cooki.js脚本在项目根目录下生成cookie,用来控制一个浏览器只能登陆一个用户,用户退出时清空cookie,关闭浏览器cookie自动清空,用户非正常退出下,需等待20分的session失效时间后方可正常登陆...
hibernate不在自动生成主键值,需要你在插入时自己指明 3.hilo:高低值算法,由数据库表提供高值,程序提供低值 value = hi*(max_lo+1)+lo 4.sequences Cat: cid name color weight age ------------------------...
一、 Jsp中访问Session时,Session已经关闭 43 二、 如果不配置事务,openSessionView出现异常 44 三、 中文乱码问题: 44 第十三课:SSH整合的jar包 45 一、 Struts2 45 二、 Hibernate3.3.2 45 三、 Spring 46
一、 Jsp中访问Session时,Session已经关闭 43 二、 如果不配置事务,openSessionView出现异常 44 三、 中文乱码问题: 44 第十三课:SSH整合的jar包 45 一、 Struts2 45 二、 Hibernate3.3.2 45 三、 Spring 46
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 ...
6:关闭Session 7:关闭SessionFactory Hibernate持久化:Hibernate根据定义的映射规则将对象持久化保存到数据库,这就实现了对象的持久化。 Spring由那几个模块组成? 答:Spring主要由7个模块组成: 1:Spring...
7.关闭Session 8.关闭SesstionFactory 为什么要用: 1. 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。 2. Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度...
4. 在用完之后关闭session 。 5. 在java 对象和 数据库之间有做mapping 的配置文件,也通常是xml 文件。 mybatis实战教程(mybatis in action)之一:开发环境搭建 mybatis 的开发环境搭建,选择: eclipse j2ee 版本,...
通过网络或磁盘等方式,把公钥编码传送给李四,李四接收到张三编码后的公钥,将其解码,李四用张三的公钥加密信息,并发送给李四,张三用自己的私钥解密从李四处收到的信息…… Java利用DES私钥对称加密代码实例 ...
通过网络或磁盘等方式,把公钥编码传送给李四,李四接收到张三编码后的公钥,将其解码,李四用张三的公钥加密信息,并发送给李四,张三用自己的私钥解密从李四处收到的信息…… Java利用DES私钥对称加密代码实例 ...