2009-08-17 2 views
2

Я пытаюсь понять лучшую праведность использования ThreadLocal для вышеуказанных вопросов. По моему мнению, причина использования этого заключается в обеспечении только одного сеанса/pm, созданного для всего приложения. Мой вопрос:ThreadLocal при использовании сеанса спящего режима/JDO persistenceManager

  1. Есть ли какое-либо влияние использования threadlocal, как это, в приложении кластеризации? (пример движка Google)?

  2. Если вы используете «транзакционное» начало, зафиксируйте на моем приложении, мне не нужно использовать threadlocal правильно? так как «транзакция» уже обеспечивает мой сеанс открытым и закрытым?

  3. Если мне нужно использовать «транзакционный», tx, он также должен быть в threadlocal?

  4. Почему бы не просто использовать «статические» вместо «threadlocal»?

Мне интересно услышать отзывы от вас всех относительно преимуществ/недостатков использования этого технического средства?

ответ

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

  2. Нет. Транзакция прилагается к сеансу, поэтому вы должны держать оба в синхронизации. Пока вы можете начать транзакцию в потоке A и зафиксировать ее в потоке B, обычно очень сложно убедиться, что эта работа надежно. Поэтому: Не надо.

  3. Да.

  4. static является глобальным для всего приложения. threadlocal является глобальным для каждого потока.

Заключение: Если вы новичок в этой области, я предлагаю использовать Spring. Spring Framework решает многие проблемы для вас и помогает вам с полезными сообщениями об ошибках, когда что-то ломается.

Следуйте документации к письму, особенно если это не имеет смысла. Скорее всего, вы пропустили что-то важное, и парни Весны правы.

+0

Согласовано. Аналогично, если у вас есть «новое соединение()» в любом месте вашего кода, вы делаете это неправильно. Используйте Spring, чтобы отвлечь все отвратительные. – Trenton

2

ThreadLocal не используется для создания одного сеанса для всего приложения. Он используется для создания одного сеанса для каждого потока. Каждый сеанс пользователя будет одним потоком, поэтому ThreadLocal гарантирует, что каждый пользователь, обращающийся к вашей веб-странице/базе данных, получит свое собственное соединение с базой данных. Если вы используете статический одноэлементный шаблон, каждый пользователь на сервере будет использовать одно и то же соединение с базой данных, и я не знаю, как это будет работать.

0

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

ThreadLocal является гарантией безопасности Thread, но может быть запрошен полусинтетическим способом позже другим кодом. Его глобальная переменная потока. Это делает его полезным для временной, но сеансовой информации. Другое использование за пределами транзакций может содержать внутренние параметры для авторизации, которые затем проверяются с помощью прокси.