问题描述
- 怎么理解ssh中dao和service是单例的
-
当多个请求调用单例service时为什么数据不会出现互相干扰?比如进行查询传进一个id,
当一请求来时栈指向堆中唯一的service进行查询,没查询完另一个请求也进来查询,
两者都指向那个service,数据不会出错么?
解决方案
线程有同步,后来的调用被阻塞,直到之前的运行完。
解决方案二:
hibernate的session submit本身有同步。
不过你的业务如果不是原子性的,你又没加锁,的确可能有问题。
解决方案三:
SSH中注解的Service和DAO默认都是单例模式的,但是可以通过@Scope注解修改实例对象生成的方式。
单例只是说明项目中所有自动注入的、相同的Service的对象都是同一个。
两个请求是在不同的线程中处理时,调用查询引用的是同一个对象的查询方法,如果查询方法中没有涉及到对这个对象的共享属性的修改,是没有问题的。
但是如果有对共享属性的修改,则需要同步处理。这方面建议你去看看Java的多线程同步的知识。祝好!
解决方案四:
dao和service对外提供的是方法,方法内只使用局部变量的情况下,每个线程间是完全独立的,分别使用单独的栈帧。
简单来说就是每个线程走的逻辑相同,但并没有用到共享的数据,所以可以用单例模式~
解决方案五:
Action会封装实例变量,不是线程安全的,所以定义为多例,而service,dao封装的变量是无状态的,线程安全的,所以一般定义为单例。可以去了解下有状态,和无状态对象。
时间: 2025-01-30 02:20:26