понедельник, 26 мая 2014 г.

Hibernate: это должен помнить каждый - 3

В связи с выпиливанием из пакета org.springframework.orm.hibernate4 класса HibernateTemplate остро встал вопрос самостоятельного управления жизненным циклом сессии в наших приложениях. С этим возникают сложности. Давайте попробуем разобраться.

Как минимум, начиная с версии Hibernate 3.1, понятие "текущая сессия" привязано к границам текущей транзакции. Сессия открывается при первом вызове getCurrentSession() и закрывается при завершении транзакции. Так же содержимое сессии автоматически синхронизируется с БД (flush) перед коммитом транзакции. Вы можете вызывать метод getCurrentSession() в вашем коде столько раз, сколько нужно, но до тех пор пока транзакция не завершена.

Для включения данного режима необходимо выставить следующие настройки:

  • hibernate.transaction.manager_lookup_class - указать стратегию, специфичную для вашего сервера приложений;

  • hibernate.transaction.factory_class - в значение org.hibernate.transaction.JTATransactionFactory (org.hibernate.engine.transaction.internal.jta.JtaTransactionFactory для Hibernate 4)

Очень важно! Применение данных настроек не означает, что каждая сессия будет автоматически закрываться при завершении транзакции. Речь идет только о сессиях, полученных посредством getCurrentSession(). Если вы в своем коде используете openSession() и управляете сессией самостоятельно, то вам необходимо явно вызывать методы flush() и close().

При использовании управляемых контейнером транзакций (Container-Managed Transactions, CMT) - стандартной функциональности EJB - настройки несколько отличаются: значение свойства hibernate.transaction.factory_class нужно выставить в org.hibernate.transaction.CMTTransactionFactory (org.hibernate.engine.transaction.internal.jta.CMTTransactionFactory для Hibernate 4).

Но что делать, если у нас нет сервера приложений?

Т.к. вне управляемого окружения, в отсутствие JTA, Hibernate не можете присоединить сессию к транзакции, он присоединяет ее к текущему потоку. При первом в потоке вызове getCurrentSession() будет создан специальный прокси-объект, не позволяющий сделать ничего, кроме как стартовать транзакцию. После старта транзакции в сессии возможно выполнение других операций. При завершении транзакции, неважно успешном или нет, текущая сессия автоматически закрывается. Следующий вызов getCurrentSession() снова создаст прокси и ситуация повторится. Таким образом Hibernate создает новые сессии, привязывает их к потокам, но на самом деле сессия имеет время жизни, совпадающее со временем жизни транзакции, т.е. полностью дублируется поведение в управляемом окружении.

Для включения данной стратегии необходимо выставить следующие настройки:

  • hibernate.transaction.factory_class - в значение org.hibernate.transaction.JDBCTransactionFactory (org.hibernate.engine.transaction.internal.jdbc.JdbcTransactionFactory для Hibernate 4);

  • hibernate.current_session_context_class - в значение thread.

Опять же, применение данных настроек не означает, что каждая сессия будет автоматически закрываться при завершении транзакции. Речь идет только о сессиях, полученных посредством getCurrentSession(). Если вы в своем коде используете openSession() и управляете сессией самостоятельно, то вам необходимо явно вызывать методы flush() и close().

Следует учитывать, что данная стратегия применима в Java SE, при использовании Java EE (по сути - при использовании EJB) нужно подключать JTA и привязывать сессию к транзакции.

Понравилось сообщение - подпишитесь на блог

пятница, 16 мая 2014 г.

Зачем нужны сервера приложений, если есть Apache Tomcat и Spring Framework?

На форуме Javatalks задали вопрос: а зачем нужны сервера приложений, если есть связка Apache Tomcat и Spring Framework? Обычно в таких случаях первые мысли возникают про EJB и сопутствующие спецификации, но на самом деле промышленные сервера приложений предоставляют множество сервисов любой программе независимо от используемых технологий. Подробный ответ доступен в моей статье.

Понравилось сообщение - подпишитесь на блог

среда, 14 мая 2014 г.

Рекомендуемые книги по программированию, проектированию и системной итеграции

В комментариях к предыдущей заметке меня попросили привести список книг, содержащих ответы на вопросы к собеседованиям. Попробую помочь коллегам.

Программирование


  • Харольд Абельсон, Джеральд Джей Сассман - Структура и Интерпретация Компьютерных Программ. На мой взгляд лучшая книга, рассказывающая что такое программирование вообще и как оно делается. Авторы проводят читателя от начал функциональной декомпозиции - понятия того, что мы пишем программу, чтобы она делала нечто полезное и эти действия можно разделить на этапы, до моделирования сложных структур данных и понимания того, как же исполняется программа. Необычным для подавляющего большинства программистов будет то, что с оператором присваивания мы знакомимся только в третьей главе, после того как напишем довольно сложную полиморфную программу! Так же авторы показывают как осуществляется интерпретация программы, ее компиляция, а так же как работает абстрактное вычислительное устройство - регистровая машина. Впрочем данное вычислительное устройство не так уже и абстрактно, стоит вспомнить, что виртуальная машина Android построена именно по регистровой модели. Само понятие ООП не вводится, но интересно, что авторы при этом умудряются рассказать, что такое связь данных и обрабатывающего их кода, конструктор, как реализовать полиморфизм и т.д. Книга содержит огромный набор задач, в интернете даже есть специальные сайты, посвященные их разбору и решениям на разных языках программирования.

  • Лавров С.С. - Программирование. Математические основы, средства, теория. Книга тяжелая и математичная, но демонстрирует базу нашей работы. Приводятся математические основы логики, формальных языков, объясняется теория вычислимости на примере языка Lisp. Автор объясняет основные понятия языков программирования, делает введение в ООП и ФП. Думаю, увлекающимся теорией будет интересно.

  • Alan Carter, Colston Sanger - The Programmers' Stone (рус). Немного о мышлении программистов или почему одни разработчики на порядок продуктивнее других.

  • Luca Cardelli, Peter Wegner - On Understanding Types, Data Abstraction, and Polymorphism. Это не книга, а скорее статья на 43 страницы, очень насыщенная математическим формализмом, в которой авторы рассказывают о том, что такое система типов. Кто занимается практическим программированием на таких языках как Java, тот по сути неявно, исходя из каких-то эмпирических закономерностей, строит программу как свою собственную систему типов. В данной работе же формально объясняется переход от нетипизированной вселенной к системе типов, в том числе и параметрических (можно понимать их как Generics). Так же есть главы, посвященные абстрактным типам данных, наследованию и полиморфизму.

  • John Hughes - Why Functional Programming Matters. Небольшая статья на 23 страницы, являющаяся введением в функциональное программирование. Объясняется что такое функции высших порядков, как их комбинировать друг с другом. В заключение приводится пример решения задачи из, как выразился автор, "искусственного интеллекта" - разбор дерева игры с помощью ФП.

  • Евгений Кирпичев - Элементы функциональных языков. Полезная статья для интересующихся ФП. Собраны сведения обо всех элементах и конструкциях функциональных языков, которые придают им такую мощь и выразительность: функции второго порядка, замыкания, сопоставление с образцом, хвостовая рекурсия, вывод типов, алгебраические типы данных, классы типов (не путать с классами в Java!) и т.д. Статья очень насыщенная и полезная, помогает иначе взглянуть на привычные вещи.