Java 用于快速访问共享数据的单例Bean

Java 用于快速访问共享数据的单例Bean,java,ejb,Java,Ejb,关于单例Bean的使用,我有几个问题 首先让我描述一下情况。 有一个web应用程序,它将有许多客户端向它发送和接收数据。其中一些数据必须持久保存在数据库中,但我需要大部分数据在服务器上可用,以便快速访问并减轻数据库的压力 我将在共享空间中使用Singleton Bean,下面是我的问题: 如果客户机_1尝试更新其在单例成员中的数据,而该单例成员当前被客户机_2写入锁定,那么客户机_1数据会发生什么情况?我是否需要为这种情况做准备,或者它像一个堆栈,并且他的写操作将在客户端完成后进行 如果我使用h

关于单例Bean的使用,我有几个问题

首先让我描述一下情况。 有一个web应用程序,它将有许多客户端向它发送和接收数据。其中一些数据必须持久保存在数据库中,但我需要大部分数据在服务器上可用,以便快速访问并减轻数据库的压力

我将在共享空间中使用Singleton Bean,下面是我的问题:

  • 如果客户机_1尝试更新其在单例成员中的数据,而该单例成员当前被客户机_2写入锁定,那么客户机_1数据会发生什么情况?我是否需要为这种情况做准备,或者它像一个堆栈,并且他的写操作将在客户端完成后进行

  • 如果我使用hashmap,哪些键将对应于单个写入客户端,那么在只能更新现有记录而不能添加新记录的
    set
    方法上放置
    @Lock(READ)
    是否安全。在我看来,由于每个客户机只能写入自己的记录,因此没有必要阻止其他客户同时更新自己的记录

  • 客户端_1将等待客户端_2完成,然后自己更新数据

  • hashmap不是线程安全的,您可能也对它感兴趣,请查看下面的一个:

    • 使用
    • 使用
    • 使用
  • private final ReadWriteLock ReadWriteLock=new ReentrantReadWriteLock();
    >       
    >私有最终锁readLock=readWriteLock.readLock();
    >     
    >private final Lock writeLock=readWriteLock.writeLock();
    >     
    >私有最终列表=新的ArrayList();
    >       
    >公共无效集(EO)
    >       {
    >writeLock.lock();
    >试一试
    >           {
    >列表。添加(o);
    >System.out.println(“通过线程添加元素”+thread.currentThread().getName());
    >               }
    >最后
    >           {
    >writeLock.unlock();
    >           }
    >       }
    
  • 客户端_1将等待客户端_2完成,然后自己更新数据

  • hashmap不是线程安全的,您可能也对它感兴趣,请查看下面的一个:

    • 使用
    • 使用
    • 使用
  • private final ReadWriteLock ReadWriteLock=new ReentrantReadWriteLock();
    >       
    >私有最终锁readLock=readWriteLock.readLock();
    >     
    >private final Lock writeLock=readWriteLock.writeLock();
    >     
    >私有最终列表=新的ArrayList();
    >       
    >公共无效集(EO)
    >       {
    >writeLock.lock();
    >试一试
    >           {
    >列表。添加(o);
    >System.out.println(“通过线程添加元素”+thread.currentThread().getName());
    >               }
    >最后
    >           {
    >writeLock.unlock();
    >           }
    >       }
    
    ()

  • EJB单例提供对方法的同步访问。如果
    client_1
    client_2
    同时调用一个
    Lock.WRITE
    方法,
    client_1
    的调用将等待
    client_2
    完成。您还可以配置超时值,以指定如果此等待时间过长,
    client_1
    将返回错误

  • 在这种情况下,映射将用于存储引用—客户机可以从映射中检索其状态对象(受读锁保护),然后修改该对象而不进行任何同步。对映射本身的更新应该受到写锁的保护(这可能仅在添加或删除条目时才需要)。请注意,如果要使用任何Java同步原语(如
    ConcurrentHashMap
    ),则需要声明您使用的是bean管理的并发-
    @Concurrentymanagement(bean)

  • 同样值得注意的是,JPA自动为您提供缓存,因此您可能会发现添加自己的缓存并不会带来太多性能好处。此外,此模型假设单个客户端不会发出并发请求-如果发出请求,您将对单个对象进行并发更新,并且需要一些额外的同步。

    ()

  • EJB单例提供对方法的同步访问。如果
    client_1
    client_2
    同时调用一个
    Lock.WRITE
    方法,
    client_1
    的调用将等待
    client_2
    完成。您还可以配置超时值,以指定如果此等待时间过长,
    client_1
    将返回错误

  • 在这种情况下,映射将用于存储引用—客户机可以从映射中检索其状态对象(受读锁保护),然后修改该对象而不进行任何同步。对映射本身的更新应该受到写锁的保护(这可能仅在添加或删除条目时才需要)。请注意,如果要使用任何Java同步原语(如
    ConcurrentHashMap
    ),则需要声明您使用的是bean管理的并发-
    @Concurrentymanagement(bean)

  • 同样值得注意的是,JPA自动为您提供缓存,因此您可能会发现添加自己的缓存并不会带来太多性能好处。此外,该模型假设单个客户机不会发出并发请求——如果发出请求,您将对单个对象进行并发更新,并且需要一些额外的同步

       private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
    >       
    >       private final Lock readLock = readWriteLock.readLock();
    >     
    >       private final Lock writeLock = readWriteLock.writeLock();
    >     
    >       private final List<E> list = new ArrayList<>();
    >       
    >       public void set(E o)
    >       {
    >           writeLock.lock();
    >           try
    >           {
    >               list.add(o);
    >               System.out.println("Adding element by thread"+Thread.currentThread().getName());
    >               }
    >           finally
    >           {
    >               writeLock.unlock();
    >           }
    >       }