应用程序作用域bean的可伸缩性和线程安全性

时间:2015-07-22 01:01:40

标签: jsf thread-safety jsf-2.2

在ApplicationScoped Bean中的

我有:

List<DataRow> doRead(String keyword){
    open FileChannel if not already opened
    ...
    MappedByteBuffer map = fileChannel.map(.... some Bytes block[start, blockLength] )
    ...
    map.get(....);
    ...
}

void doUpdate(String newString){
    open FileChannel if not already opened
    ...
    MappedByteBuffer map = fileChannel.map(.... some Bytes block[start, blockLength] )
    ...
    map.put(....);
    ...
}

问题:

比方说,2个用户同时发送请求:

第一个用户(会话1)调用sessionBean.abc{applicationScopedBean.doRead(keyword)}

第二个用户(会话2)调用sessionBean.xyz{applicationScopedBean.doUpdate(newString)}

现在可以说两种方法doRead()&amp; doUpdate()访问相同字节块,然后

  1. 如果ApplicationScoped Bean处理(不同的用户)逐个请求(据我所知,这是不正确的),那么我不必关心同步对该fileChannel的访问权限吗?
  2. 但是如果ApplicationScoped Bean以并行方式处理用户请求(多线程),那么我是否可以同步对该fileChannel的访问权限呢?
  3. 如果是2:

    1. 我可以同步Object(fileChannel),这样一次只能有一个“Thread”访问它。但这意味着,即使其他线程试图访问该文件中的不同字节块,它也会被阻止!所以我认为这是一个糟糕的同步。
    2. 我可以对 fileChannel 的部分/段(字节块)进行同步,这样我就可以获取该频道文件的给定区域的锁定。
    3. 这个想法有意义吗?或者也许Application Server的线程池确保在这种情况下的某种安全性?

      (只是一个想法)@Asynchronous Annotation在这里有用吗? (我使用Tomcat 8,但如果需要,我可以切换到TomEE或JBoss等。)

      我标记了JSF,因为我不确定应用服务器的线程池如何处理用户请求(从sessionScopedBean访问applicationScoped bean)。

      注意:这种方法背后的想法是我正在尝试实现类似基于Java内存映射文件的数据库, 我尝试自己完成JSF应用程序中的所有逻辑,而不是通过套接字或其他人与“独立”应用程序进行通信。所以我决定先用这种方式尝试,如果失败我会重新考虑它。

      非常感谢您的帮助,

      由于

0 个答案:

没有答案