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

Grails中service的线程安全的小例子

阅读更多
不小心弄出一个线程不安全的Service
class ExcelImpService extends AbstractExcelImporter {
    ExcelImportService excelImportService

    List<Map> imp(FileStore excelFileStore, Map config) {
        String excelPath = excelFileStore.path
        assert new File(excelPath).exists()
        this.read(excelPath)
        println workbook.getSheetName(0)
        println workbook.getSheetName(0)  //停一下
        excelImportService.columns(workbook, config)
    }
}

因为默认依赖注入的service是单实例的,所以会出现下面的结果
---sout---
浏览器1:company
浏览器2:expenseGroup
浏览器2:expenseGroup
浏览器1:expenseGroup  (属性对象被别的线程修改了,应该还是company才对)

这个问题还是很隐晦的,而且线程安全问题一般不容易测试,所以要尽量从理论上消灭在萌芽状态
public abstract class AbstractExcelImporter extends imexporter.AbstractImexporter {
Workbook workbook= null  //这个继承过来的属性就是隐患,每次调用read方法,都会修改之   
    ...略...
}
经验:service如果有属性,要么搞成final的,否则就要格外留意方法中对其修改的操作。

解决办法:
开始想把ExcelImpService改成一个普通类,但是不利于获得其它service的支持(excelImportService)。。。

把service声明为session或request级别的,体验一下基于使用条件的线程安全。
    /**
     * default(singleton) is NOT thread safe, since extends workbook prototype from AbstractExcelImporter
     * request -- 同一浏览器的同一tab是线程安全的
     * session -- 不同(厂商)浏览器间是线程安全的,同一浏览器的不同tab是不安全的(但一般没人那么无聊吧,所以这就够了)
     */
    static scope = 'session'
1
1
分享到:
评论
1 楼 px96004 2013-08-22  
不知道定义成 session 级别性能如何

相关推荐

    Grails中文参考手册

    Services 是可重用的业务逻辑组件,它们是无状态的,可以跨多个请求和线程安全地执行。Services 可以被 Controllers 调用,实现复杂的业务流程。 **Plugins** Grails 插件系统是其强大功能之一,允许开发者复用和...

    学习grails框架时候自己写的例子

    在这个例子中,你可能学会了如何在Grails中使用`groovy.sql.Sql`类或者HQL(Hibernate Query Language)进行定制化查询。 3. **分页功能**:在Web应用中,数据分页是很常见的需求。Grails提供了方便的分页API,可以...

    grails中文入门简介

    Grails在IT行业中尤其受到重视,因为它能够帮助开发者快速搭建并部署基于MVC模式的应用程序。 在入门Grails之前,首先需要了解如何下载并安装这个框架。Grails官方提供了各个版本的下载链接,通常包括zip压缩包和可...

    grails中文API

    它们可以扩展Grails核心功能,如安全、缓存、搜索引擎优化等。通过引入插件,开发者可以快速地添加新特性到项目中。 8. **配置与环境** Grails支持多环境配置,如开发、测试和生产环境,这使得在不同阶段使用不同...

    Grails1.1中文文档

    Grails1.1中文文档

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

    FCKEditor是一款著名的在线文本编辑器,grails-fckeditor-0.9.5插件则是将其集成到Grails应用中的解决方案。以下是关键点: 1. 安装与配置:在Grails项目中添加插件依赖,然后通过配置文件调整编辑器的参数,如默认...

    grails中的上传,下载

    在Grails框架中,文件的上传与下载是常见的功能需求,尤其在开发涉及大量文档、图片或媒体文件处理的应用程序时。以下是对Grails中上传和下载操作的深入解析,包括其实现机制、代码示例及注意事项。 ### 文件上传 ...

    Grails1.1中文文档(CHM)

    Grails1.1最新 中文 文档 当今的Java Web开发技术显得过于复杂,相对于它本身的需要来说。现在主流的Java Web框架也是异常复杂,而且没有很好的遵循 Don't Repeat Yourself (DRY) 法则。 因此我们要以一种新的思维...

    grails 中文手册

    **Grails 框架详解** Grails 是一个基于 Groovy 语言的开源Web应用程序框架,它构建在Java平台之上,充分利用了Java EE的许多功能,同时提供了更简洁、高效的语法,使得开发过程更为快捷。Grails 的设计目标是简化...

    grails 中文第二版

    - Grails版本信息可以在项目的`BuildConfig.groovy`文件中找到。 **文档引擎** - 提供了文档生成工具,帮助开发者快速生成API文档。 **依赖解析** - Grails使用Ivy作为其依赖管理系统。 - 支持配置依赖关系,包括...

    Grails Grails Grails

    1. **模型(Model)**: 在Grails中,模型通常由Domain Classes表示,它们是持久化的实体,与数据库表对应。Domain Classes使用Groovy的元编程特性,如属性验证和动态方法,提供数据验证和业务逻辑。 2. **视图...

    Grails 1.1 中文手册 chm

    Grails 最新的 v1.1版的中文文档,chm格式,Grails是一套快速开发Web应用的开源框架,基于Groovy编程语言,并构建于Spring、Hibernate和其它标准Java框架之上,能为大家带来超高效率的一站式框架。

    grails中文文档

    6. **插件系统**:Grails 插件丰富了框架的功能,如缓存、安全、测试等。了解如何查找、安装和使用插件,可以快速扩展你的应用。 7. **构建和部署**:学习 `grails war` 命令打包应用,以及如何将应用部署到各种...

    Eclipse下搭建Grails项目

    在Eclipse中搭建Grails项目可能相对复杂,但通过以下步骤,即使是初学者也能顺利进行。 1. **Grails环境安装** - 首先,你需要从Grails官网(http://grails.org/)下载最新版的Grails安装包。 - 安装完成后,确保...

    Grails权威指南 Grails权威指南

    5. **Grails插件系统**:Grails拥有庞大的插件库,涵盖各种功能,如安全、缓存、报表、测试等。通过插件,开发者可以轻松地扩展框架功能,避免重复造轮子。 6. **Grails构建工具**:Grails的构建系统自动化处理许多...

    Grails入门指南中文第二版.pdf

    7. **Grails服务(Service)**:服务层在Grails中的作用,如何定义服务并进行事务管理。 8. **Grails过滤器(Filters)**:过滤器在应用程序中的应用,如何在特定的HTTP请求或响应之前/之后执行代码。 9. **Grails...

    Grails入门精通及中文API

    在学习过程中,还可以参考在线教程、视频课程和社区论坛,如Stack Overflow和Grails官方社区,以便获取更多实践经验和帮助。 总之,Grails作为Java平台上的快速Web开发框架,以其高效、灵活和丰富的生态系统,为...

Global site tag (gtag.js) - Google Analytics