【问题标题】:How to deal with Java EE concurrency如何处理 Java EE 并发
【发布时间】:2014-03-18 04:29:23
【问题描述】:

请告诉我在软件项目中提供应用程序并发的最佳实践。我想将 Hibernate 用于 ORM。 Spring 来管理事务。数据库为 MySQL。

我的并发要求是让尽可能多的用户连接到数据库和
进行 CRUD 操作并使用服务。但我不喜欢过时的数据。

  1. 如何处理 DB 中的数据并发问题。
  2. 如何处理应用程序并发。如果两个线程同时访问我的对象会破坏我的对象的状态吗?
  3. 最佳做法是什么。
  4. 是否建议在 spring 方法中定义隔离级别 @Transactional(isolation=Isolation.READ_COMMITTED)。如何做出这个决定?

我想出了以下项目想知道您的反馈和解决方法?

一个。如何处理 DB 中的数据并发问题。 使用版本标签和时间戳。

b.如何处理应用程序并发。 提供乐观锁定。不使用同步,而是为每个请求创建对象(范围原型)。

c.最佳做法是什么。 尽可能缓存对象。

【问题讨论】:

    标签: spring hibernate concurrency


    【解决方案1】:
    1. 如果需要,可以使用交易和实体中的 @Version 字段。
    2. Spring bean 默认是单例的,因此由线程共享。但它们通常是无状态的,因此本质上是线程安全的。 Hibernate 实体不应该在线程之间共享,除非您自己明确地这样做:每个事务都在自己的线程中运行,将有自己的 Hibernate 会话,加载自己的实体实例。
    3. 范围太广,无法回答。
    4. 数据库的默认隔离级别通常是您想要的。我知道的大多数数据库都是 READ_COMMITTED。

    关于你的观点 c(尽可能缓存对象),我想说这正是你不应该做的。缓存使您的应用程序有状态,难以集群,更加复杂,并且您必须处理缓存的陈旧性。在

    之前不要缓存任何内容
    • 您遇到了性能问题
    • 您无法调整算法和查询来解决性能问题
    • 您已经证明缓存可以解决性能问题
    • 您已经证明缓存不会导致比性能问题更严重的问题

    数据库很快,并且已经为您在内存中缓存数据。

    【讨论】:

      猜你喜欢
      • 2015-06-29
      • 2012-11-09
      • 2014-09-07
      • 2013-04-15
      • 1970-01-01
      • 2011-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多