- 浏览: 863189 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
yukang1:
蚂蚁lovejing 写道我也出现与楼上相同的问题。查了一些资 ...
Spring中实现文件上传 -
史玉凤:
必须用ie浏览器
javascript获取客户端网卡MAC地址和IP地址和计算机名 -
蚂蚁lovejing:
我也出现与楼上相同的问题。查了一些资料,描述的跟楼主的博文差不 ...
Spring中实现文件上传 -
温柔一刀:
djlijian 写道最近也在研究redis,如何在项目中使用 ...
Redis 常见的性能问题和解决方法 -
djlijian:
最近也在研究redis,如何在项目中使用呢?感觉网上的资料太少 ...
Redis 常见的性能问题和解决方法
Spring+Hibernate中OpenSessionInView模式运用 中会在Update Domain Object时遇到
可能的解決方式有:
1、将singleSession设为false,这样只要改web.xml,缺点是Hibernate Session的Instance可能会大增,使用的JDBC Connection量也会大增,如果Connection Pool的maxPoolSize设得太小,很容易就出问题。
2、在控制器中自行管理Session的FlushMode,麻烦的是每个有Modify的Method都要多几行程式。
4、让方法受Spring的事务控制。
下面着重解说第4种方式:
OpenSessionInViewFilter里的几个方法:
可以看到OpenSessionInViewFilter在getSession的时候,会把获取回来的session的flush mode 设为FlushMode.NEVER。然后把该sessionFactory绑定到TransactionSynchronizationManager,使request的整个过程都使用同一个session,在请求过后再解除该sessionFactory的绑定,最后closeSessionIfNecessary根据该session是否已和transaction绑定来决定是否关闭session。在这个过程中,若HibernateTemplate 发现自当前session有不是readOnly的transaction,就会获取到FlushMode.AUTO Session,使方法拥有写权限:
如果有不是readOnly的transaction就可以由Flush.NEVER转为Flush.AUTO,拥有insert,update,delete操作权限,如果没有transaction,并且没有另外人为地设flush model的话,则doFilter的整个过程都是Flush.NEVER。所以受transaction保护的方法有写权限,没受保护的则没有。
采用spring的事务声明,使方法受transaction控制:
对于上面的,以Insert,Update结尾的方法拥有可写的事务,如果某个方法,如方法名为savaSort(),则没有写权限,这时若此方法内有insert,update,delete操作的话,则需要手动设置flush model为Flush.AUTO,如:
如果是这样配置的事务,把readOnly去掉就好了
嘿,兄弟,你有什么好的解决方法吗?
我在想法是:把save,update之些更新数据操作的不要用这个OpenSessionInView
但我现在所有的后缀是用.do 的url-pattern
但*/edit.do的url-patten又是不正确的,问请教一下你的怎么正确使用的,对了spring才刚用,只看了简单的使用说明,没有作深入研究。
不过 温柔一刀 兄,见到问题直接去解决也是一个好习惯!和和不能否则别人的做法,但没有深入研究spring的代码没有发言权,如果有经验就明显。和和
可能事务配置的时候没有包含你的情况,改成如下试试
注意:<prop key="*">PROPAGATION_REQUIREDprop> 是把所有操作纳入事务
是啊
我知道
我就是这么解决的嘛
不是吧
我刚搜索了下
好象不只我一个啊
很多啊
可以啊
但是直接update就会有上面的异常
org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.NEVER) - turn your Session into FlushMode.AUTO or remove 'readOnly' marker from transaction definition
异常问题,这个Exception在尚未进入DAO时就会遇到,是一个会发生在Modify Domain Object时的问题。可能的解決方式有:
1、将singleSession设为false,这样只要改web.xml,缺点是Hibernate Session的Instance可能会大增,使用的JDBC Connection量也会大增,如果Connection Pool的maxPoolSize设得太小,很容易就出问题。
2、在控制器中自行管理Session的FlushMode,麻烦的是每个有Modify的Method都要多几行程式。
session.setFlushMode(FlushMode.AUTO);
session.update(user);
session.flush();
3、Extend OpenSessionInViewFilter,Override protected Session getSession(SessionFactory sessionFactory),将FlushMode直接改为Auto。session.update(user);
session.flush();
4、让方法受Spring的事务控制。
下面着重解说第4种方式:
OpenSessionInViewFilter里的几个方法:
java 代码
- protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,FilterChain filterChain) throws ServletException, IOException {
- SessionFactory sessionFactory = lookupSessionFactory();
- logger.debug("Opening Hibernate Session in OpenSessionInViewFilter");
- Session session = getSession(sessionFactory);
- TransactionSynchronizationManager.bindResource(sessionFactory, new SessionHolder(session));
- try {
- filterChain.doFilter(request, response);
- }
- finally {
- TransactionSynchronizationManager.unbindResource(sessionFactory);
- logger.debug("Closing Hibernate Session in OpenSessionInViewFilter");
- closeSession(session, sessionFactory);
- }
- }
- protected Session getSession(SessionFactory sessionFactory) throws DataAccessResourceFailureException {
- Session session = SessionFactoryUtils.getSession(sessionFactory, true);
- session.setFlushMode(FlushMode.NEVER);
- return session;
- }
- protected void closeSession(Session session, SessionFactory sessionFactory)throws CleanupFailureDataAccessException {
- SessionFactoryUtils.closeSessionIfNecessary(session, sessionFactory);
- }
可以看到OpenSessionInViewFilter在getSession的时候,会把获取回来的session的flush mode 设为FlushMode.NEVER。然后把该sessionFactory绑定到TransactionSynchronizationManager,使request的整个过程都使用同一个session,在请求过后再解除该sessionFactory的绑定,最后closeSessionIfNecessary根据该session是否已和transaction绑定来决定是否关闭session。在这个过程中,若HibernateTemplate 发现自当前session有不是readOnly的transaction,就会获取到FlushMode.AUTO Session,使方法拥有写权限:
java 代码
- public static void closeSessionIfNecessary(Session session, SessionFactory sessionFactory)throws CleanupFailureDataAccessException {
- if (session == null || TransactionSynchronizationManager.hasResource(sessionFactory)){
- return;
- }
- logger.debug("Closing Hibernate session");
- try {
- session.close();
- }
- catch (JDBCException ex) {
- throw new CleanupFailureDataAccessException("Could not close Hibernate session", ex.getSQLException());
- }
- catch (HibernateException ex) {
- throw new CleanupFailureDataAccessException("Could not close Hibernate session", ex);
- }
- }
如果有不是readOnly的transaction就可以由Flush.NEVER转为Flush.AUTO,拥有insert,update,delete操作权限,如果没有transaction,并且没有另外人为地设flush model的话,则doFilter的整个过程都是Flush.NEVER。所以受transaction保护的方法有写权限,没受保护的则没有。
采用spring的事务声明,使方法受transaction控制:
xml 代码
- <bean id="manager" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
- <property name="proxyInterfaces">
- <list>
- <value>com.zhupan.service.IManagervalue>
- list>
- property>
- <property name="transactionManager">
- <ref bean="transactionManager" />
- property>
- <property name="target">
- <ref local="managerTarget" />
- property>
- <property name="transactionAttributes">
- <props>
- <prop key="*Insert">PROPAGATION_REQUIREDprop>
- <prop key="*Update">PROPAGATION_REQUIREDprop>
- <prop key="*Get*">PROPAGATION_REQUIRED,readOnlyprop>
- <prop key="*List*">PROPAGATION_REQUIRED,readOnlyprop>
- props>
- property>
- bean>
对于上面的,以Insert,Update结尾的方法拥有可写的事务,如果某个方法,如方法名为savaSort(),则没有写权限,这时若此方法内有insert,update,delete操作的话,则需要手动设置flush model为Flush.AUTO,如:
session.setFlushMode(FlushMode.AUTO);
session.update(user);
session.flush();
session.update(user);
session.flush();
评论
15 楼
seairy
2007-01-11
<bean id="xxxManager" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="transactionManager"> <ref bean="transactionManager" /> </property> <property name="target"> <ref bean="xxxManagerTarget" /> </property> <property name="transactionAttributes"> <props> <prop key="*">PROPAGATION_REQUIRED,readOnly</prop> </props> </property> </bean>
如果是这样配置的事务,把readOnly去掉就好了
14 楼
xiaolan02
2007-01-04
在公司配spring的时候用的都是singleSession为false,没用到session,说这样不安全,现在也没理清原因。
13 楼
sys53
2006-12-20
引用
downpour 2006-11-10 20:01
这是因为你没有正确使用Spring引起的你的问题,那么多使用OpenSessionInView的案例,都没有碰到你所谓的问题。
你这样搞一篇文章,很容易给初学者一个信号,OpenSessionInView就是你这么用的,这不是误导是什么?
这是因为你没有正确使用Spring引起的你的问题,那么多使用OpenSessionInView的案例,都没有碰到你所谓的问题。
你这样搞一篇文章,很容易给初学者一个信号,OpenSessionInView就是你这么用的,这不是误导是什么?
嘿,兄弟,你有什么好的解决方法吗?
我在想法是:把save,update之些更新数据操作的不要用这个OpenSessionInView
但我现在所有的后缀是用.do 的url-pattern
但*/edit.do的url-patten又是不正确的,问请教一下你的怎么正确使用的,对了spring才刚用,只看了简单的使用说明,没有作深入研究。
不过 温柔一刀 兄,见到问题直接去解决也是一个好习惯!和和不能否则别人的做法,但没有深入研究spring的代码没有发言权,如果有经验就明显。和和
12 楼
温柔一刀
2006-11-14
[quote="kj23"]那为什么不置入事务中呢,有什么理由在对数据库有写操作的地方不纳入事务管理呢?难道错了就让他去? ?????????
11 楼
温柔一刀
2006-11-14
男儿当 写道
冒着生命危险来证明一下!
楼主,我也遇到过 OpenSessionInView 这种问题.方法的事务已经配置了
,只是在insert update delete 操作的时候 报上面你提到的FlushMode.NEVER错误.
通过如下方法:
session.setFlushMode(FlushMode.AUTO);
session.update(user);
session.flush();
能够解决,但是感觉并不是一个好办法.
希望有这方面经验的达人们,可以不吝赐教!
以上证人证词不承担被拍砖的责任. ^@^
楼主,我也遇到过 OpenSessionInView 这种问题.方法的事务已经配置了
,只是在insert update delete 操作的时候 报上面你提到的FlushMode.NEVER错误.
通过如下方法:
session.setFlushMode(FlushMode.AUTO);
session.update(user);
session.flush();
能够解决,但是感觉并不是一个好办法.
希望有这方面经验的达人们,可以不吝赐教!
以上证人证词不承担被拍砖的责任. ^@^
可能事务配置的时候没有包含你的情况,改成如下试试
<bean id="manager" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="proxyInterfaces"> <list> <value>com.zhupan.service.IManagervalue> list> property> <property name="transactionManager"> <ref bean="transactionManager" /> property> <property name="target"> <ref local="managerTarget" /> property> <property name="transactionAttributes"> <props> <prop key="*">PROPAGATION_REQUIREDprop> props> property> bean>
注意:<prop key="*">PROPAGATION_REQUIREDprop> 是把所有操作纳入事务
10 楼
男儿当
2006-11-14
冒着生命危险来证明一下!
楼主,我也遇到过 OpenSessionInView 这种问题.方法的事务已经配置了
,只是在insert update delete 操作的时候 报上面你提到的FlushMode.NEVER错误.
通过如下方法:
session.setFlushMode(FlushMode.AUTO);
session.update(user);
session.flush();
能够解决,但是感觉并不是一个好办法.
希望有这方面经验的达人们,可以不吝赐教!
以上证人证词不承担被拍砖的责任. ^@^
楼主,我也遇到过 OpenSessionInView 这种问题.方法的事务已经配置了
,只是在insert update delete 操作的时候 报上面你提到的FlushMode.NEVER错误.
通过如下方法:
session.setFlushMode(FlushMode.AUTO);
session.update(user);
session.flush();
能够解决,但是感觉并不是一个好办法.
希望有这方面经验的达人们,可以不吝赐教!
以上证人证词不承担被拍砖的责任. ^@^
9 楼
kj23
2006-11-11
那为什么不置入事务中呢,有什么理由在对数据库有写操作的地方不纳入事务管理呢?难道错了就让他去?
8 楼
温柔一刀
2006-11-11
Norther 写道
那是因为你在有写操作的地方没有配置事务
是啊
我知道
我就是这么解决的嘛
7 楼
Norther
2006-11-11
那是因为你在有写操作的地方没有配置事务
6 楼
温柔一刀
2006-11-10
5 楼
温柔一刀
2006-11-10
downpour 写道
这是因为你没有正确使用Spring引起的你的问题,那么多使用OpenSessionInView的案例,都没有碰到你所谓的问题。
你这样搞一篇文章,很容易给初学者一个信号,OpenSessionInView就是你这么用的,这不是误导是什么?
你这样搞一篇文章,很容易给初学者一个信号,OpenSessionInView就是你这么用的,这不是误导是什么?
不是吧
我刚搜索了下
好象不只我一个啊
很多啊
4 楼
downpour
2006-11-10
这是因为你没有正确使用Spring引起的你的问题,那么多使用OpenSessionInView的案例,都没有碰到你所谓的问题。
你这样搞一篇文章,很容易给初学者一个信号,OpenSessionInView就是你这么用的,这不是误导是什么?
你这样搞一篇文章,很容易给初学者一个信号,OpenSessionInView就是你这么用的,这不是误导是什么?
3 楼
温柔一刀
2006-11-10
怎么能说误导呢?
这是我实际开发中遇到过的问题啊
OpenSessionInView模式能update domain object
但是直接update就会有上面的异常
这是我实际开发中遇到过的问题啊
OpenSessionInView模式能update domain object
但是直接update就会有上面的异常
2 楼
温柔一刀
2006-11-10
downpour 写道
你这是在误导别人。难道OpenSessionInView模式就不能update domain object了?那Spring还怎么混?
可以啊
但是直接update就会有上面的异常
1 楼
downpour
2006-11-10
你这是在误导别人。难道OpenSessionInView模式就不能update domain object了?那Spring还怎么混?
发表评论
-
这个action怎么测试?
2007-03-06 18:43 2801action类大概样子如下: java 代码 p ... -
webwork 下载文件的单元测试问题
2007-03-06 09:18 4570写了一个action负责文件下载的方法,大概代码如下这样子: ... -
C3P0连接池详细配置
2006-07-09 04:24 3716<c3p0-config> <defa ... -
Spring AOP中文教程
2006-07-13 23:01 2565AOP正在成为软件开发的下一个圣杯。使用AOP,你可以将 ... -
iBatis使用总结
2006-08-10 15:50 2512持久层使用了iBatis后,大家的编码风格统一了,可以 ... -
iBatis入门例子
2006-08-11 14:05 10536iBatis 是一个 O/R Mapping 解决方案, i ... -
Spring中实现文件上传
2006-08-17 10:28 48571实现图片上传 用户必须能够上传图片,因此需要文件上传的 ... -
spring对commons_fileupload和cos_fileuplaod的封装
2006-08-22 09:21 2955spring对commons_fileupload和cos_ ... -
Spring-Validator 说明文档
2006-08-22 10:57 7839Spring-Validator 的主要意图是为 Spring ... -
Spring+Hibernate中OpenSessionInView模式运用
2006-09-20 14:54 3361Spring+Hibernate中, 如果不用OpenSes ... -
spring 生成Excel和PDF文件
2006-10-04 12:11 4593HTML页面并不总是向用户显示数据输出的最好方式,有时候需要生 ... -
sping 、jxl 生成excel文件下载
2006-10-08 18:12 5142ExcelBean.java文件用于生成Excel java ... -
ibatis 自带分页方法
2006-08-28 19:45 5289ibatis自带函数: java 代码 ... -
关于acegi安全框架登陆后转向的疑问
2006-10-03 09:50 5003我想实现的要求是这样的:有几种不同的角色登陆使用系统,但是登陆 ... -
执行几次查询之后就不能查询了,页面不动了
2006-09-18 14:43 23026每执行依次查询,控制台就有这样的警告 java代码如下: p ... -
spring、ibatis控制oracle分页的问题
2006-08-30 09:46 12049开发采用spring+ibatis,数据库用oracle,数据 ...
相关推荐
OpenSessionInView模式确保在整个HTTP请求生命周期内,数据库操作都在一个开放的Hibernate Session中进行,从而避免了延迟加载时的数据丢失问题。 标题"OpenSessionInView项目整合jar包"指的是包含实现...
在使用Hibernate进行对象持久化时,经常遇到的一个问题是关于懒加载(lazy loading)的处理。懒加载是一种优化技术,允许在真正需要某个关联对象的数据时才加载它们,而不是一开始就加载所有相关联的数据。这种策略...
同时,需要注意的是,OpenSessionInView模式虽然方便,但也会带来潜在的问题,如事务边界不清晰和会话泄漏。因此,在实际应用中,应结合具体需求谨慎使用,并考虑使用更现代的解决方案,如Spring Data JPA的...
为了解决这个问题,Spring提供了一个过滤器 `OpenSessionInViewFilter` 或者 `OpenSessionInViewInterceptor`,通常简称为OSIV(Open Session In View)模式。 OSIV模式的核心思想是在Controller层和View层之间保持...
在处理Web应用时,Spring提供了一些关键特性,如`CharacterEncodingFilter`和`OpenSessionInViewFilter`,它们对于解决特定问题至关重要。 首先,让我们深入了解一下`CharacterEncodingFilter`。在Web应用中,字符...
当一个对象被加载时,与其关联的对象不一定立即加载到内存中,而是等到真正需要使用时才加载,这就是懒加载(Lazy Loading)的基本思想。这一策略对于提高系统性能和减少内存占用具有重要意义。 #### Lazy Loading...
4. **使用OpenSessionInView模式**:这是一种常用的做法,在Web请求开始时打开Session,在请求结束时关闭Session。这样可以在整个请求过程中安全地访问延迟加载的对象。 5. **自定义Session管理**:通过Spring管理...
OpenSessionInView模式是一种解决数据持久层和Web层之间事务管理的策略。在用户请求到达时开启一个数据库Session,在请求处理完后关闭Session。这样,整个请求生命周期内,数据库操作都可以在一个Session内完成,...
- 注意:对于这些容器类提供的`size()`和`isEmpty()`等方法,并不能保证原子性,即在调用这些方法时可能会看到过期的结果。 #### 7. 阻塞队列与线程通信 - **阻塞队列**:`BlockingQueue`是一种特殊的队列,它...
23. **事务传播级别**:定义了在一个事务方法内调用另一个事务方法时的行为,例如REQUIRED、SUPPORTS、MANDATORY等。 #### 四、JavaScript相关 1. **盒子模型**:浏览器渲染元素时,元素的大小由内容、内边距、...
当应用程序需要访问数据库时,可以从池中获取一个已经建立好的连接,使用完毕后再将连接归还给连接池,而不是关闭连接。这种方式可以显著提高应用程序的性能,因为它避免了频繁创建和销毁连接所带来的开销。 #### 2...
5. 如果使用OpenSessionInView模式,需要确保读写操作的Session分配正确。 在实际应用中,还需要考虑事务管理和异常处理,确保系统稳定性和数据一致性。同时,根据业务需求,可能还需要动态切换数据源,这通常通过...
对于OpenSessionInView模式的问题,Spring 提供了OpenSessionInViewFilter或OpenSessionInViewInterceptor来解决。 7. **事务管理**:Spring 提供了两种事务管理方式:编程式和声明式。编程式事务管理使用...
因为同一个 Action 实例可能会被多个线程共享,导致并发访问时出现问题。 - **解决方案**: - 声明局部变量,避免在 Action 类中使用实例变量。 - 扩展 RequestProcessor,使得每次请求都会创建一个新的 Action ...
- **OpenSessionInView模式**:这是一种解决懒加载异常的有效方案,通过确保Session在整个请求生命周期中保持打开状态,使得在任何时间点都可以获取到关联对象的数据。 ##### Hibernate的缓存机制 **缓存** 在...
- **异常处理**:解决未配置事务导致的 openSessionInView 异常。 - **乱码问题**:解决中文乱码问题的方法。 #### 第十三课:SSH 整合的 Jar 包 - **Struts2**:列出 Struts2 及其相关库。 - **Hibernate3.3.2**...
- **事务配置**:未配置事务可能导致openSessionInView模式下异常。 - **中文乱码**:需要配置字符编码以解决乱码问题。 **SSH整合的jar包** - **Struts2,Hibernate,Spring**:确保引入了所有必要的jar包,包括...