weixin_42470122 2012-02-10 11:15
浏览 170
已采纳

从STRUTS2到JPA的调用过程的疑问??

在struts2的action中注入了service的对象,service是用@Service("userService")注释进行实例化的,那实例化类型是不是必须为@Scope("prototype")这种类型,担心在struts2的多线程、多并发访问的时候在service类的方法中会导致数据混乱(请大家帮我解释一下这点);,因为struts2不是单例的,那是不是service类也必须要是@Scope("prototype"),这样为每个请求都重新创建一个service类的对象,这样才不致于在多线程情况下导致数据可能混乱呢??????

代码如下:
STRUTS2 Action类

public class UserAction extends BaseAction {

private static final long serialVersionUID = -2575509284575823496L;

@Resource(name = "userService")
private UserService userService;

private User user;
private List<Role> roleList;

public String add() throws Exception {
    if (CollectionUtils.isEmpty(roleList)) {
        addActionError("请选择角色");
        return INPUT;
    }
    user.setRoleSet(new HashSet<Role>(roleList));
    userService.createUser(user);
    return SUCCESS;
}

}

SERVICE类:
@Scope("") ??????????????????? 这里什么时候用singleton 或者 prototype????????????????????????????????
@Service("userService")
public class UserServiceImpl extends PersistService implements UserService {

public void createUser(User user){
    user.setPassword(MD5Utils.MD5Encode(user.getPassword()));
    this.getJpaPersistence().persist(user);
}

}

在上面service类继承的PersistService 类中,也用spring注入了一个对数据库的通用的dao操作类(JpaPersistence jpaPersistence)
这样就可以在不同的service类中使用相同的dao操作类,这个通用的dao操作类是由spring的配置文件实例化的,配置如下:



那这个通用的dao操作类(JpaPersistence jpaPersistence)也就是singleton的,那这个通用的dao操作类在不同的service类中使用,会不会也像在STRUTS2的action中使用service类一样会导致数据混乱呢???

  • 写回答

2条回答 默认 最新

  • myali88 2012-02-10 13:37
    关注

    [quote]
    2) 对于service层,我还是有点疑惑。
    对于service类,你的意思是这样的嘛: service类中,一般就只是将传入的数据进行增、删、改、查,不会有对数据的修改,但我的理解是,service类就是业务逻辑类,业务流程全部封装在service类的方法中,是有可能对从action中传入的数据进行修改的,不然spring的事务控制加在service类的方法上就没有意义了,那事务控制就只能加在action的方法上了, 如果要在service类的方法中进行数据修改,service类默认又是singleton的,那从action中调用service类中的方法,就有可能出现数据混乱 ( 对这点很困惑,不知道是不是和php一样,相同的service类的对象,只要在调用其方法时就会开辟一个新栈,这样就不会有多线程不同步导致的数据混乱问题,还是说应该加入@Scope("prototype")避免其数据混乱 )
    [/quote]
    我说的service不用考虑并发问题,指的是Service对象本身,因为在JVM中对象是存储在堆上的,所以如果对象本事是有状态的,那么在并发请求下,这些属性有可能需要同步。但通常情况下,Spring里面的Service是完全无状态的,所以说Service本事是线程安全,并发请求不会有问题。
    至于不同的action调用相同的service的同一方法的问题,那更不用担心,因为java的方法调用是基于栈的,这些栈都是线程独立的,所以每次action调用servcie的方法时,其实都是在独立的环境中,即时传入的对象参数是一样的,那也只能到最终保持到数据库时考虑数据的一致性,这个是后面的事务问题了。
    整个过程中,最需要考虑并发的是数据库,因为所以的CRUD操作最终都会落实到数据库上,而每个数据记录又都和实体对象对应,所以只有在数据操作时需要考虑并发问题,但这个问题已经由数据库和hibernate完成了,spring里面设置的事务配置其实也是依赖于底层的数据库事务,事务的隔离级别就告诉你了,数据库的操作在什么样的情况下不会出现并发问题。具体的每个事务隔离级别代表的含义,你可以查查。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥20 怎么在stm32门禁成品上增加记录功能
  • ¥15 Source insight编写代码后使用CCS5.2版本import之后,代码跳到注释行里面
  • ¥50 NT4.0系统 STOP:0X0000007B
  • ¥15 想问一下stata17中这段代码哪里有问题呀
  • ¥15 flink cdc无法实时同步mysql数据
  • ¥100 有人会搭建GPT-J-6B框架吗?有偿
  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 解riccati方程组