Практика Java

Отрывки из жизни на острове Ява

02 Октябрь
0Отзывов

Настройка таймаута получения ответа для веб-сервисов (CXF)

За этот год дважды сталкивался с эффектом домино – промышленные Системы масштаба страны падали одна за другой, причем первая “зависшая” Система тянула за собой другие, до того момента работающие без сбоев. В обоих случаях виновником было синхронное взаимодействие посредством веб-сервисов, и одним из звеньев цепочки была Система, разработчиком которой являюсь я, обозначим ее как НС (наша Система). В первом случае НС стала первой в цепочке. При передаче очередной сборки на промышленный сервер забыли скрипт создания индекса по полю в БД. По этому полю накладывал ограничение один из веб-сервисов, развернутых на стороне НС. Сначала проблему не заметили, но по мере увеличения количества обращений к веб-сервису, нагрузка росла, и, в конце концов, привела к коллапсу – НС “зависла”. Те, кому не важны интересные факты взаимодействия промышленных Систем, могут сразу переходить к последнему абзацу, где и описываются настройки CXF.

Читать полностью…

20 Май
0Отзывов

RichFaces: будь осторожнее с javax.faces.PROJECT_STAGE

Свойство javax.faces.PROJECT_STAGE добавляется в WEB.XML для указания вашей реализации JSF в каком окружении работает приложение в данный момент, основные варианты: в тестовом/в разработке (Development) и в промышленном (Production). Разные реализации JSF могут по-разному реагировать на это свойство. На этапе Development, например, вам могут выдаваться подсказки о некорректном состоянии View, расширенные сообщения об ошибках, и даже автоматически добавляться элементы message для отображения пользователю ошибок, о которых “забыл” разработчик. Оказалось, что в некоторых случаях, можно нарваться на серьезные неприятности, если запустить на промышленный сервер приложение с настройкой Development.

Читать полностью…

16 Май
0Отзывов

Hibernate: зачем ты это сохранил?!

Маленькая заметка о ещё одном побочном эффекте Hibernate. Всем известно о том, что Hibernate предоставляет различные методы для сохранения сущности (в разных версиях с разными названиями, вроде saveOrUpdate или merge). Казалось бы, всё ясно: вызвал метод – запись в таблице БД сохранилась. Практика показала, что это вовсе не так. Судя по всему, методы, явно приказывающие Hibernate сохранять сущности, на самом деле этого не делают. Вместо этого, сущности просто добавляются в текущую сессию, и терпеливо ждут завершения транзакции (commit), во время которого и происходит непосредственно сброс в БД всех изменений, кешированных в сессии.

Читать полностью…

13 Май
0Отзывов

Hibernate: Eager может вас погубить

Статья касается в основном связок OneToMany. Разница между Eager (“жадной”) и Lazy (“ленивой”) инициализацией коллекций интуитивно понятна, и “разжёвана” во многих открытых источниках. Но есть одна очень важная вещь, упоминаний о которой я не увидел в топиках о “Eager vs Lazy” на stackoverflow, да и сам не знал о ней, чуть ли не десяток лет пользуясь Hibernate. Казалось бы, всё ясно, “как божий день”: сначала из БД считывается сущность-родитель, затем список подчинённых сущностей; при этом для Eager эти запросы выполняются сразу друг за другом, а для Lazy второй запрос к БД будет выполнен позже. Lazy теоретически может снизить нагрузку на БД, в случае если подчинённые сущности так и не понадобятся, но при этом нередко создаёт проблему “LazyInitializationException – no session or session was closed”. Распространённый ответ на вопросы о такой проблеме – совет заменить Lazy на Eager.

Но, оказывается, Eager и Lazy отличаются не только тем, в какой момент осуществить выборку из БД. Более того, разница в нагрузке на БД между Eager и Lazy может отличаться на порядки при выборке одних и тех же данных!

Читать полностью…

19 Февраль
0Отзывов

Как узнать IP-адрес в Java?

Казалось бы, простой вопрос, многими решаемый даже без Гугла. На практике всё не так просто. Расскажу про проблемный случай из своей практики, а если неинтересно, переходите сразу к способу решения проблемы. Есть сервера приложений JBoss, работающие в кластере. Каждый из серверов исполняет некую задачу, а по её завершении сохраняет в БД запись о отметке времени запуска задачи. Встала задача уникально идентифицировать запись каждого сервера, чтобы при следующем запуске каждый узел считал из БД именно свою запись, со своим временем. Не особо задумываясь, сразу применил System.getProperty(“jboss.server.name”), протестировал на своём сервере, получил уникальное имя машины, на которой запущен JBoss. Проверили тестировщики на своем стенде, то же самое, всё работает “на ура”. Выложив на промышленные сервера, получили 3 записи “localhost”. Да, можно попросить админов настроить имена серверов, но кто гарантирует что при очередных маневрах с переносом/добавлением узлов, они не забудут это делать? Решено искать пути, независящие от настроек окружения.

Читать полностью…

11 Октябрь
0Отзывов

Пессимистическая блокировка в Hibernate может обмануть

Нередко возникают ситуации, при которых требуется обеспечить атомарность и целостность хранимых объектов в многопоточной среде. Доводилось встречать разные “изыски” с синхронизацией при помощи средств языка Java, как только народ не извращался, но абсолютно все способы периодически “пробивались” в промышленной эксплуатации. Это приводило к ошибкам, некоторые из которых годами (!!!) терпеливо вручную исправлялись в БД системными администраторами. Как бы вы не исхитрилясь, даже если добьетесь 100% непробиваемой синхронизации в пределах JVM, грош ей будет цена если потребуется развернуть ваше приложение в кластере. Передо мной тоже когда-то давно вставала задача синхронизации действий с записью в БД, и я, конечно, тоже в первую очередь смотрел в сторону synchronized.
Читать полностью…

26 Сентябрь
0Отзывов

Вы считаете Hibernate медленным? Тогда мы идем к вам!

Нередко на просторах Интернета возникают споры по поводу того, стоит ли в проекте применять ORM, или кодить все SQL-запросы и их обработку вручную. Пожалуй, единственной претензией к ORM являются претензии к его производительности. Основной же проблемой самостоятельного конвертирования объектов-в-базу и обратно является распухающий грязный исходный код приложения. Я решил внести свои “пять копеек” в этот холивар. Т.к. блог о практике Java-разработки, то, соответственно, посмотрим мы на мой личный опыт работы с чистым JDBC и Hibernate.

Читать полностью…

21 Июнь
0Отзывов

Миграция на JBoss 7 (EAP 6): проблемы веб-сервисов, Unmarshalling Error

При переходе на новый движок веб-сервисов CXF в JBoss 7 появлялись разные проблемы. Одной из них была ошибка десериализации. Возникла следующим образом. На JBoss-е развернут клиент веб-сервиса, разработан на аннотациях JAX-WS, при инициализации (создании экземпляра клиента) интерфейс реализуется движком CXF, в 7-м JBoss-е по умолчанию обрабатывающем все операции с веб-сервисами. Клиент отправляет запрос на другой сервер (всё нормально на этом этапе), а вот при получении ответа выбрасывается исключение. Причем на версии JBoss 4.2.3 всё работало прекрасно, теперь же всё “сломалось”, хотя изменился только движок веб-сервисов, в прикладном ПО никаких изменений. Читать полностью…

20 Февраль
1Отзыв

Работа с ЭЦП, часть 2 – WS Security против

В первой статье цикла мы остановились на том, что лично мне на практике довелось столкнуться с двумя форматами передачи подписанного документа посредством веб-сервисов. Чтобы как-то определиться с терминологией, я назову их так:

  1. WS-Security – стандарт подписания веб-сервисов. Это существующий термин, не требующий дополнительного уточнения.
  2. DigiSign – XML Digital Signature. В контексте статьи я этим термином условно назову процесс передачи подписанных документов в виде самостоятельной XML-структуры.

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

20 Февраль
0Отзывов

Java Generics на практике

В теорию и спецификации Java Generics не вдаемся, в Сети много информации об этом, а также можно найти и ответы на вопросы и практические примеры. Цель конкретно данной статьи (и моих “пяти копеек”) в том, чтобы в одном месте собрать все основные примеры применения Java Generics, которые мне лично довелось использовать в реальных системах масштаба предприятия (JEE).

Читать полностью…