Java 使用内存中的DB而不是ThreadLocal的优缺点是什么

Java 使用内存中的DB而不是ThreadLocal的优缺点是什么,java,thread-local,Java,Thread Local,到目前为止,我们一直在使用ThreadLocal来传输一些数据,以避免API混乱。然而,下面是一些我不喜欢的使用线程本地的问题 1) 多年来,本地线程中携带的数据项有所增加 2) 自从我们开始使用线程(用于一些轻量级的处理)以来,我们还将这些数据迁移到池中的线程,并再次将它们复制回来 我正在考虑为这些应用程序使用内存中的DB(我们不想将其添加到API中)。我想知道这种方法是否好。利与弊是什么 好,这里是一个简单的场景 用户登录并提交请求 系统为整个请求建立上下文,包括 -此请求的唯一id -用户

到目前为止,我们一直在使用ThreadLocal来传输一些数据,以避免API混乱。然而,下面是一些我不喜欢的使用线程本地的问题

1) 多年来,本地线程中携带的数据项有所增加 2) 自从我们开始使用线程(用于一些轻量级的处理)以来,我们还将这些数据迁移到池中的线程,并再次将它们复制回来

我正在考虑为这些应用程序使用内存中的DB(我们不想将其添加到API中)。我想知道这种方法是否好。利与弊是什么

好,这里是一个简单的场景

  • 用户登录并提交请求
  • 系统为整个请求建立上下文,包括 -此请求的唯一id -用户名 -系统故障(用户可以登录多个系统) -一些域事件供以后使用
  • 请求通过多个逻辑层(表示、业务域、, 规则、整合)等
  • 在集成层,我们从池中借用几个线程来并行提取数据 多个合作伙伴。每个拉取都需要一些存储在线程本地的数据,所以我们将这些数据迁移到池线程
  • 从合作伙伴接收到所有数据后,我们将积累在子线程中的新线程本地数据迁移回主线程
  • 在交互结束时,我们将域事件持久化到DB

  • 您可能希望引入请求上下文:


    如果使用WebContainer,则可以在筛选器中处理此类对象的创建/销毁;如果使用ApplicationServer,则可以在拦截器中处理此类对象的创建/销毁

    我担心你使用ThreadLocal。您是否关心并发性问题?如果没有,那么为什么要使用ThreadLocal?如果是,那么您是否计划为每个正在运行的线程创建一个内存中的数据库?数据项对于给定的请求是唯一的,我们不想将这些数据到处传递。。。我们为每个事务(或请求)生成一个唯一密钥,我可以根据唯一密钥集中存储数据(当前在threadlocal中)。现在很难回答这个问题,因为不清楚用例是什么。。您可能需要添加一些说明性代码。我的意思是,
    ThreadLocal
    中的
    键是
    线程本身,对吗?那你有另一把独特的钥匙吗??至于“传递数据”,通常会封装任何数据并传递对它的引用。。似乎与API的混乱无关。就我个人而言,我很困惑。@Pangea:我认为内存中的数据库在这方面做得太过分了。特别是如果数据是临时的。但很难说,因为我真的不知道存储的数据类型。我建议您考虑另一种存储解决方案。也许有点像中央位置的ConcurrentHashMap。这样,如果您真的找到了修复此设计缺陷的方法,那么很容易删除。