问题标签 [thread-local]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 使用内存数据库而不是 ThreadLocal 的优缺点是什么
到目前为止,我们一直在使用 ThreadLocal 来承载一些数据,以免使 API 混乱。但是下面是一些我不喜欢使用本地线程的问题
1)这些年来,本地线程中承载的数据项有所增加 2)自从我们开始使用线程(用于一些轻量级处理)以来,我们也将这些数据迁移到池中的线程并再次将它们复制回来
我正在考虑为这些使用内存数据库(我们不想将其添加到 API 中)。我想知道这种方法是否很好。有什么好处和坏处。
好的,这是一个简单的场景
- 用户登录并提交请求
- 系统为整个请求建立上下文,其中包括 - 此请求的唯一 ID - 用户名 - 登录的系统(用户可以登录多个系统) - 一些 DOMAIN EVENTS 供以后使用
- 请求通过多个逻辑层(表示、业务领域、规则、集成)等
- 在集成层,我们从池中借用少量线程来并行拉取多个伙伴的数据。每个拉取都需要一些先前存储在线程本地的数据,因此我们将这些数据迁移到池线程
- 在从伙伴处收到所有数据后,我们将子线程中积累的新线程本地数据迁移回主线程
- 在交互结束时,我们将 DOMAIN 事件持久化到 DB
java - EJB 容器中的 ThreadLocal(和 Singleton)
我编写了一个授权系统,它依赖于代表当前用户的对象。为了简化编程并提高性能,我想在用户登录后将这些对象保存在 ThreadLocal 中。
它看起来像这样:
我读过静态元素会使聚类成为问题。如果我在每个集群节点上都有一个 UserCache,它们都有自己的缓存对象,与其他节点上的缓存对象不同步。对?UserCache
是单例的经典候选者,因为应用程序只需要它的单个实例。但据我所知,@Singleton EJB 在集群中具有相同的行为。
那么如何在 EJB 3.1 (Java EE 6) 环境中使 UserCache 可集群化呢?
从答案中提取的解决方案:
- 使用 CDI (JSR 299) 中的 SessionScope 或
- 将 JVM 集群与 Terracotta 一起使用
java - 为什么我的应用程序中的每个线程都使用不同的休眠会话?
我有一个使用休眠的网络应用程序,出于某种原因,每个线程(httprequest 或与排队相关的其他线程)都使用不同的会话。我已经实现了一个HibernateSessionFactory
如下所示的类:
现在从我的测试来看,threadLocal
成员确实只在类首次加载时初始化一次,JVM
但由于某种原因,当不同的线程访问getSession()
它们使用不同会话的方法时。当一个线程第一次访问这个类 (Session) threadLocal.get();
时将返回 null 但正如预期的那样,所有其他访问请求都将产生相同的会话。我不确定这是如何发生的,因为threadLocal
变量是最终的,并且该方法threadLocal.set(session)
仅在上述上下文中使用(我 99.9% 肯定必须产生一个非空会话,因为我会NullPointerException
在不同的部分遇到我的应用程序)。
我不确定这是否相关,但这些是我hibernate.cfg.xml
文件的主要部分:
我会很感激任何帮助,当然,如果有人有任何问题,我很乐意澄清。伊泰
java - 有没有办法遍历或复制 Java ThreadLocal 的所有值?
语境:
我想说的是:
java - 在应用程序层之间提供身份验证和授权信息的好方法
我有一个在 Google App Engine (GAE) for JAVA 上运行的网络应用程序。我在 Servlet 层对客户端进行身份验证,但希望将客户端信息提供给我的业务和数据层,而不必通过每个函数的参数传递客户端对象。
我正在考虑使用 ThreadLocal 设置“会话”类型的对象。这样任何函数都可以说如下:
这是做到这一点的好方法,还是有其他更受欢迎的解决方案?
谢谢!
java - 连接池与每线程 JDBC 连接
以下哪种方法更好:连接池或每线程 JDBC 连接?
c++ - 你知道在 C++ 中获取线程本地存储的不同方法的一些性能测试吗?
我正在做一个广泛使用线程局部变量的库。您能否指出一些测试在 C++ 中获取线程局部变量的不同方法的性能的基准:
- C++0x thread_local 变量
- 编译器扩展(Gcc __thread,...)
- boost::threads_specific_ptr
- 线程
- 视窗
- ...
C++0x thread_local 在提供它的编译器上表现更好吗?
python - 从 C/C++ 程序调用的多个操作系统线程上的多个独立嵌入式 Python 解释器
在 C/C++ 应用程序中嵌入 Python 解释器是有据可查的。在从 C/C++ 应用程序调用的多个操作系统线程(即同一进程内的一个操作系统线程上的一个解释器)上运行多个 python 解释器的最佳方法是什么?此类应用程序还可能存在与内存碎片和Py_Finalize() 限制相关的问题。
一种这样的方法可以是:
- Python 线程,因此 GIL 在 pyconfig.h 中被禁用以保持简单(#undef WITH_THREAD)
- Python 解释器源代码的所有可变全局变量都移动到通过线程本地存储引用的堆分配结构(参考:电话上的 Python)。
我的问题是:
- 有没有更好的方法?
- 是否有任何工具可以自动将 Python Interpreter 源代码的全局变量转换为通过 TLS(线程本地存储)引用的堆分配结构?
这里讨论了类似的主题:
java - Google App Engine (GAE) 上的 ThreadLocal
我想在我的应用引擎应用程序中提供一些请求范围的数据。
例子:
- 发出请求的 URL。
- 认证信息。
我看到这ThreadLocal
是在 GAE 的JRE 白名单上。
ThreadLocal
提供此信息是否是一种安全的好方法?是否有替代/更好/更被接受的方式?
python - 为什么在 Django 中使用线程局部变量不好?
我正在使用线程本地来存储当前用户和请求对象。通过这种方式,我可以轻松地从程序中的任何位置(例如动态表单)访问请求,而无需传递它们。
为了在中间件中实现线程本地存储,我遵循了 Django 网站上的教程: https ://web.archive.org/web/20091128195932/http://code.djangoproject.com:80/wiki/CookBookThreadlocalsAndUser
此文档已被修改以建议避免使用此技术: https ://web.archive.org/web/20110504132459/http://code.djangoproject.com/wiki/CookBookThreadlocalsAndUser
来自文章:
从设计的角度来看,threadlocals 本质上是全局变量,并且受到全局变量通常带来的所有常见的可移植性和可预测性问题的影响。
更重要的是,从安全的角度来看,threadlocals 带来了巨大的风险。通过提供暴露其他线程状态的数据存储,您可以为您的 Web 服务器中的一个线程提供一种可能修改系统中另一个线程状态的方法。如果 threadlocal 数据包含用户描述或其他与身份验证相关的数据,则该数据可用作攻击的基础,从而授予未经授权的用户访问权限,或公开用户的私人详细信息。虽然可以构建一个不受此类攻击的线程本地系统,但防御性并构建一个从一开始就不受任何此类漏洞影响的系统要容易得多。
我理解为什么全局变量可能不好,但在这种情况下,我在自己的服务器上运行自己的代码,所以我看不到两个全局变量会带来什么危险。
有人可以解释所涉及的安全问题吗?我问过很多人,如果他们阅读了这篇文章并且知道我正在使用线程本地,他们将如何破解我的应用程序,但没有人能够告诉我。我开始怀疑这是喜欢明确传递对象的令人毛骨悚然的纯粹主义者的观点。