【问题标题】:Implementing a real time counter using spring and either hibernate or AtomicInteger, best way?使用spring和hibernate或AtomicInteger实现实时计数器,最好的方法是什么?
【发布时间】:2012-06-23 08:21:57
【问题描述】:

在注入控制器的服务类中使用原子整数作为实例变量。缩放受限于每个线程运行操作所需的内存,以及每秒处理多少个请求(cpu 花费和对原子整数执行操作的时间?)

@Service
public MyService{

AtomciInteger count = new AtomicIntger(0);

 public int add() {
   return count.incrementAndGet();
 }

    // accessed via ajax loop (and controller), if value changes update display
  public int getCount() {
    return count.get();
  }
}

服务类将通过控制器访问,控制器将作为 RESTful Web 服务提供,通过 ajax 调用访问。它可以如何处理模拟用户/请求?

我能想到的唯一选择是使用休眠实体并将整数值存储为字段。让 hibernate 处理线程问题,其中 sessionfactory 将被注入到 dao 中,而 dao 被注入到服务类中——扩展问题?我的春季课程都是单身人士。

【问题讨论】:

    标签: java spring hibernate scalability


    【解决方案1】:

    AtomicIntger 尽可能快。阅读它(volatile 字段)接近于阅读普通的int。更新使用带有简单while 循环的CAS 操作,这不能更快且线程安全地完成。您正在使用 Spring(可能还有几层 AOP 方面,Spring MVC 控制器(具有大量反射),并且您通过 HTTP 协议调用它。递增和访问一个 int 是您遇到的最少的问题。

    使用 Hibernate(与此相关的是 JDBC)的唯一好处是跨多个服务器的可扩展性。但是,使用普通的 JDBC 和数据库序列代替 Hibernate - 与Atomic* 类相比,速度要快得多,但速度要慢两个数量级。考虑 来获得两者:适中的速度和简单性。

    【讨论】:

    • 这是在服务类中存储状态,通常应该避免这种情况 - 但对于这样一个简单的情况,它是否合适?对于典型的大型网站(以及更复杂的问题),持久化到数据库/缓存是最好的,因为它允许服务器/tomcat 实例集群运行?
    • @NimChimpsky:有状态服务类不是问题,只要您只有一台服务器。如果您想扩展并拥有一个服务器集群,那么从多个服务器(我猜经常)访问相同的表/序列将成为瓶颈。实际上,在分布式环境中拥有顺序、一致和可靠的计数器本身就是一个问题,请参阅:stackoverflow.com/questions/10017338
    • 使用 atmoic 整数,最大请求数(又名线程或用户)的主要瓶颈是处理器速度吗?每个线程都可以同时访问堆栈上的方法,所以 RAM 应该不是问题吗?显然,对于这样一个小问题,其他因素会出现......但我试图了解潜在的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-08
    • 2012-06-17
    • 1970-01-01
    • 2015-08-21
    • 2023-04-01
    • 2011-02-23
    • 2012-04-06
    相关资源
    最近更新 更多