春豆范围

时间:2014-02-04 03:58:18

标签: spring hibernate

我一直在谷歌搜索,我只是意识到一些非常奇怪的东西(至少对我而言)。显然,建议将弹簧对象设置为单例。我有几个问题:

  1. 从逻辑上讲,它会影响性能吗?如果100个用户(总夸张)使用相同的@service对象,那是不是意味着其他99个必须排队才能获得@service? (因此,绩效问题)
  2. 如果通过一些恶魔般的设计,那些弹簧对象有状态(同步问题)?这通常发生在ORM中,因为BaseDAOImpl通常具有保护注入的sessionfactory
  3. 说到注入sessionfactory,我以为注释不是继承的?有人可以解释一下吗? 感谢

2 个答案:

答案 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)

  1. 服务对象是singleton并不意味着它具有同步访问权限。多个用户可以同时调用它。就像Web应用程序中的许多并发用户使用单个servlet实例一样。您只需要确保单个对象中没有状态。

  2. SessionFactory是一个威胁安全对象,因为它的不可变会话不是线程安全的。由于会话工厂是一个重型对象,因此建议每个应用程序共享一个会话工厂对象,但要使用多个会话。

  3. 不清楚你的3点,请你详细说明一下。

    希望有所帮助