我一直在谷歌搜索,我只是意识到一些非常奇怪的东西(至少对我而言)。显然,建议将弹簧对象设置为单例。我有几个问题:
答案 0 :(得分:3)
显然建议将spring对象设置为单例。
不一定推荐,但这是默认设置。
从逻辑上讲,它会影响性能吗?如果100个用户(总计 夸张)使用相同的@service对象,不是那个意思 其他99必须排队才能获得@service? (从而, 绩效问题)
首先,忘记用户。考虑对象,线程和对象监视器。如果线程尝试获取另一个线程拥有的对象监视器,则该线程将阻塞并等待。这是Java synchronization概念的基础。您可以使用同步来实现代码的关键部分的互斥。
如果你的bean是无状态的,@Service
bean可能应该是(just like a @Controller
beans),那么就没有关键部分。使用相同@Service
bean的线程之间不共享任何对象。因此,没有涉及synchronized
块,并且没有线程在任何其他线程上等待。不会有任何性能下降。
如果通过某种恶魔般的设计,那些弹簧物体会有状态 (同步问题)?这通常发生在ORM以来 BaseDAOImpl通常具有受保护的注入sessionfactory
典型的设计可以使用SessionFactory#getCurrentSession()
使用Session
返回绑定到线程的ThreadLocal
。再说一遍,这些库写得很好。几乎总有一种方法可以避免任何并发问题,无论是通过上面的ThreadLocal
设计还是通过使用bean范围来实现。
如果你不能,你应该编写你的代码,以便瓶颈尽可能小,即。只是关键部分。
说到注入sessionfactory,我认为注释不是 遗传?有人可以对此作出解释吗?
我不确定你的意思。你是正确的,注释不是继承的(但是方法是用它们的注释继承的)。但这可能不适用于你所询问的情况,所以请澄清一下。
答案 1 :(得分:0)
服务对象是singleton并不意味着它具有同步访问权限。多个用户可以同时调用它。就像Web应用程序中的许多并发用户使用单个servlet实例一样。您只需要确保单个对象中没有状态。
SessionFactory是一个威胁安全对象,因为它的不可变会话不是线程安全的。由于会话工厂是一个重型对象,因此建议每个应用程序共享一个会话工厂对象,但要使用多个会话。
不清楚你的3点,请你详细说明一下。
希望有所帮助