Это хорошая идея использовать ThreadLocal как контекст для данных? - PullRequest
3 голосов
/ 01 февраля 2011

Является ли хорошей идеей использовать ThreadLocal в качестве контекста для данных в веб-приложении?

Ответы [ 5 ]

6 голосов
/ 01 февраля 2011

Это зависит от объема данных. ThreadLocal будет специфичным для потока запроса, а не для сеанса пользователя (каждый запрос может использовать другой поток обработки запроса). Следовательно, будет важно удалить данные по завершении обработки запроса (чтобы они не перетекли в сеанс другого пользователя, когда тот же поток обслуживает их запрос).

6 голосов
/ 01 февраля 2011

Вот для чего это было сделано.Но позаботьтесь об удалении ThreadLocal в конце контекста, иначе вы можете работать с утечками памяти или, по крайней мере, слишком долго хранить неиспользуемые данные.

ThreadLocals также очень быстрые, вы можете думать о них как оHashMap<Thread,Object>, который всегда запрашивается с Thread.getCurrentThread().

2 голосов
/ 01 февраля 2011

Если вы заполняете пару запрос / ответ одним потоком, то, по моему опыту, она работает нормально. Тем не менее, «управляемые событиями» веб-приложения входят в моду с появлением ajax и высокопроизводительных контейнеров. Эти управляемые событиями модели позволяют возвращать поток запроса в их пул потоков, например, во время событий ввода / вывода, так что поток не занят в ожидании возврата внешнего вызова службы. В результате один логический запрос может обслуживаться несколькими разными потоками. Архитектура, управляемая событиями, в сочетании с NIO на стороне сервера может значительно повысить пропускную способность.

С учетом сказанного, если ваше приложение не имеет этой архитектуры, мне кажется разумным.

Если вы не знакомы с этой моделью, взгляните на комету Tomcat 6 и продолжение Jetty 6. Это специфичные для поставщика реализации асинхронного ввода-вывода в ожидании официальной поддержки Servlet 3.0. Обратите внимание, что Tomcat 7 теперь полностью совместим с 3.0.

1 голос
/ 17 марта 2011

В общем, я бы сказал нет. Используйте рамки, чтобы сделать это для вас.

На веб-уровне веб-приложения используйте контекст сеанса (или другой контекст, специфичный для верхнего фреймворка), чтобы хранить данные и определять состояние по объему запроса.

Если вы вводите бизнес-уровень, он, конечно, не должен зависеть от определенного веб-контекста. spring и Java EE предоставляют решения для безопасности, транзакций и постоянства в качестве контекста.

Если вы коснетесь этого вручную, вы должны быть очень осторожны; это может привести к проблемам с очисткой, утечкам памяти и странным ошибкам ...

1 голос
/ 01 февраля 2011

ThreadLocal в многопоточной программе во многом совпадает со статическим / глобальным в непоточной программе.То есть использование ThreadLocal - мерзость.

...