`
Jcat
  • 浏览: 49144 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Grails的乐观锁产生的异常无法捕获

阅读更多
今天是一个小想法,引出一堆问题,一顿扫盲呀,基础很重要呀。这也印证了之前在论坛讨论Grails时我的观点:
引用
grails不适合新手学习哦~
Grails是一个敏捷的MVC框架,更准确的说是以spring、hibernate为基础的一堆框架的集合。优点就是开发迅速,“容易上手”。

这里,容易上手是针对已经熟悉Java开发的同学:熟悉Servlet、熟悉Spring、熟悉Hibernate等。有这些基础的同学可以很快将Grails运用自如。

但是,Grails不适合作为学习Java Web开发的入门内容,原因就是它太敏捷。没错,照着官方文档,可以很轻松写出Hello World,基于scaffold可以很快搭建出一个小小的原型,新手肯定特别兴奋。但问题就是,当你想要深入一点的时候,会发现缺乏前述各种框架的知识,甚至缺乏对JavaEE的基础知识,然后就会迷失、无从下手。


今天的小想法就是想测试一下Grails的乐观锁机制,于是就引出了以下问题:
1. 要测试乐观锁,就需要多线程,而且我想把颗粒度模拟的很细,模拟一些很极端的情况。琢磨半天,发现IDEA有多线程debug的功能(其实大多数IDE都有),用起来老强大了。


默认是ALL,也就是单线程的,浏览器B的操作需要等浏览器A的断点完成后才能进行。


改成Thread,就可以debug并发的情况了。两个线程遇到断点都会停下来,还可以选择控制让谁先执行断点,很方便呀。


2. 有了强大工具支持,可以开始试验了。

如上图,设计了一个试验例子。本以为最终能够模拟出数据一致的情况,但实际却抛出了乐观锁的异常。。。误导我的正是Grails生成的controller update代码,让我误以为需要人为判断version(我还以为这叫乐观锁呢)
引用
  if (testInstance.version > version) {
                render(view: "edit", model: [testInstance: testInstance])
                return
            }

错误的理解,需要写代码判断version
正确的理解,其实是由Hibernate在save的时候自行判断version,由此实现乐观锁

3. 好吧,既然你能抛出异常(StaleObjectStateException - Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect),那我就try-catch处理之



结果是怎么catch也catch不到。。。百度也烂到家,根本搜不到有用的东西。于是挂上vpn,google是王道。

引用
try{
   getHibernateTemplate().delete(userObj);
} catch (StaleObjectStateException e) {
   e.printStackTrace();
}
How do i catch this exception ??

You won't be able to catch it there, because it's not the delete call that throws the exception, but the flush of the session, which happens later (before the execution of a query, or before the transaction commit).
You should not catch this exception anyway, because when Hibernate throws an exception, you can't continue using the session anymore: it's in an unstable state. The only part of the application where such an exception can be caught is outside of the transaction, in order to display an error message to the user (or retry, but this won't be possible in this particular case).

简单的说,就是异常并不是由save()抛出的,而是经过一系列传递由Hibernate抛出的,而且此时会话已经无法使用了。直截了当说,这类异常无法捕获
这也说明了,为什么Grails生成的代码中,人为判断了一下,这么做可以很大程度上避免异常。(相当于在较长时间的人工录入表单之后,进行了一次version验证,并处理;而只有在像我模拟的极端情况,才会引发异常)
  • 大小: 21.1 KB
  • 大小: 27 KB
  • 大小: 93.6 KB
  • 大小: 31.7 KB
分享到:
评论

相关推荐

    Hibernate乐观锁

    Hibernate乐观锁是数据库事务控制的一种策略,主要用于处理并发更新数据的情况。在乐观锁的机制下,假设并发用户很少会发生冲突,所以在读取数据时不会进行任何锁定,而在更新数据时才会检查在此期间是否有其他用户...

    Grails Grails Grails

    **Grails 框架详解** Grails 是一个基于 Groovy 语言的开源Web应用程序框架,它构建在Java平台之上,旨在简化开发过程并提高生产力。Grails 的设计深受Ruby on Rails的影响,提供了MVC(模型-视图-控制器)架构模式...

    Grails权威指南 Grails权威指南

    《Grails权威指南》是一本全面深入探讨Grails框架的专著,旨在帮助读者掌握这一强大的Web开发工具。Grails是一种基于Groovy语言的开源框架,它为构建现代、高效的应用程序提供了简洁高效的解决方案。本指南针对不同...

    Eclipse下搭建Grails项目

    【Grails项目搭建详解】 Grails是一个基于Groovy语言的开源Web应用框架,它简化了开发过程,尤其适合快速构建动态网站。在Eclipse中搭建Grails项目可能相对复杂,但通过以下步骤,即使是初学者也能顺利进行。 1. *...

    grails-用户手册

    《Grails用户手册》 Grails,作为一个基于Groovy语言的开源Web应用框架,深受开发者喜爱,它简化了Java开发的复杂性,提供了强大的MVC(Model-View-Controller)架构,以及丰富的插件系统。这份用户手册将帮助你...

    grails开发环境配置及应用开发

    Grails开发环境配置及应用开发 Grails是一种基于Java的Web开发框架,它提供了一个灵活、快速和高效的开发方式。为了让开发者更好地使用Grails,我们需要配置Grails开发环境。在本文中,我们将详细讲解Grails开发...

    eclipse开发grails插件

    对于Grails开发,我们需要的是Eclipse中的Grails插件,它能够提供对Grails项目的创建、运行、调试等一系列功能。 **Grails**是基于Groovy语言的全栈式Web开发框架,它借鉴了Ruby on Rails的设计理念,提供了快速...

    grails-2.4.4.zip

    《Grails 2.4.4 框架深度解析》 Grails 2.4.4 是一个基于Java的开源Web应用框架,它利用Groovy语言的强大特性,为开发者提供了一种高效、灵活的开发环境。这个压缩包“grails-2.4.4.zip”包含了完整的Grails 2.4.4...

    Grails中文参考手册

    **Grails 概述** Grails 是一个基于 Groovy 语言的开源 web 应用程序框架,它构建在 Java 平台上,旨在提高开发效率,简化常见 Web 开发任务。Grails 遵循 Model-View-Controller (MVC) 架构模式,允许开发者快速...

    Grails 的过滤器(Grails Filters)

    **Grails 框架与过滤器(Grails Filters)详解** Grails 是一个基于 Groovy 语言的、用于构建动态Web应用的开源框架。它提供了丰富的特性,简化了Java平台上的开发工作,如自动代码生成、元编程支持以及灵活的数据...

    eclipse插件grails(groovy)

    Eclipse 插件 Grails(Groovy)是一个强大的开发工具,它使得在Eclipse环境中进行Groovy和Grails应用的开发变得更为便捷。Groovy是一种动态、面向对象的编程语言,而Grails则是一个基于Groovy的开源Web应用框架,...

    grails login

    **Grails登录系统详解** Grails是一个基于Java的开源Web应用程序框架,它使用Groovy语言进行开发,提供了高效、简洁的编程模型。在Grails中实现用户登录功能是构建任何Web应用的基础,它确保了数据的安全性和用户...

    grails 中文文档+grails-fckeditor-0.9.5.zip插件

    《Grails技术详解:中文文档与Fckeditor-0.9.5插件解析》 Grails,作为一款基于Groovy语言的开源Web应用框架,以其高效、简洁的特性深受开发者喜爱。它集成了许多Java EE的功能,同时简化了开发流程,使得开发人员...

    grails-core源码

    《Grails核心源码解析——基于版本2.2.2》 Grails,作为一个基于Groovy语言的全栈式Web应用框架,深受开发者喜爱。它以其简洁的语法、丰富的插件系统以及对Spring和Hibernate的无缝集成,为开发高效、灵活的Web应用...

    grails ajax

    Grails 是一个基于Groovy语言的开源Web应用框架,它构建在Spring Boot之上,提供了丰富的功能和便捷的开发体验。Ajax(Asynchronous JavaScript and XML)技术则是Web开发中用于实现页面无刷新、局部更新的一种重要...

    Grails1.1中文文档

    《Grails 1.1 中文文档》是一个非常宝贵的资源,尤其对于国内的开发者来说,由于Grails在中文社区中的资料相对较少,这份文档的价值不言而喻。Grails是一个基于Groovy语言的开源Web应用框架,它借鉴了Ruby on Rails...

    grails 1.0.4

    Grails专为下一代JavaWeb应用程序而设计的框架,其借助于Groovy动态语言,使...不过在我们继续介绍Grails之前,有必要先探究一下如今其他的Java框架及他们的用户体验,因为正是他们的积累,才会产生Grails这样的框架。

    Grails入门指南 -- 针对grails1.0.4更新

    Grails入门指南中文pdf -- 针对grails1.0.4更新,附加idea8 开发grails的流程

Global site tag (gtag.js) - Google Analytics