<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
	<title>Хабрахабр / JAVA / Захабренные</title>
	<link>http://habrahabr.ru/rss/blog/java/</link>
	<description><![CDATA[Захабренные посты из блога «JAVA» на Хабрахабре]]></description>
	<language>ru</language>
	<managingEditor>editor@habrahabr.ru</managingEditor>
	<generator>habrahabr.ru</generator>
	<pubDate>Sat, 11 Feb 2012 02:27:02 GMT</pubDate>
	<lastBuildDate></lastBuildDate>
	<image>
		<link>http://habrahabr.ru/</link>
		<url>http://habrahabr.ru/i/logo.gif</url>
		<title>Хабрахабр</title>
	</image>
	
		
		
	<item>		
		<title><![CDATA[JAVA / Непрерывный мониторинг JVM с помощью Zabbix]]></title>
		<guid isPermaLink="true">http://habrahabr.ru/blogs/java/137641/</guid>
		<link>http://habrahabr.ru/blogs/java/137641/</link>			
		<description><![CDATA[Предположим, у вас есть большое приложение написанное на Java. Это может быть web-сервлет размещенный в контейнере или standalone-сервис. В процессе разработки (да и во время эксплуатации) возникает необходимость отслеживать процессы, протекающие в JVM: работу garbage collector, использование памяти, жизненный цикл потоков, а так же иные специфичные для вашего проекта показатели по средствам MBean. Самый простой вариант — использовать профилировщик. Но увы, проблемы не случаются по расписанию, и невозможно заранее знать, когда нужно подключить профилировщик, а держать его постоянно включенным тоже не вариант. В таких случаях идеальное решение — непрерывный мониторинг. О нем и пойдет речь. Но для начала пара слов о классической профилировке.<br/>
<div class="habracut"> <a class="habracut" href="http://habrahabr.ru/blogs/java/137641/#habracut">Читать дальше &rarr;</a> </div>]]></description>
		
		<pubDate>Fri, 10 Feb 2012 01:48:12 GMT</pubDate>
		<author>redcraft</author>
		<category>jvm</category><category>java</category><category>zabbix</category><category>monitoring</category>
	</item>
	
	
	
	
	
	

		
	<item>		
		<title><![CDATA[JAVA / Размер Java объектов. Используем полученные знания]]></title>
		<guid isPermaLink="true">http://habrahabr.ru/blogs/java/136883/</guid>
		<link>http://habrahabr.ru/blogs/java/136883/</link>			
		<description><![CDATA[В <a href="http://habrahabr.ru/blogs/java/134102/">предыдущей статье</a> много комментаторов были не согласны в необходимости наличия знаний о размере объектов в java. Я категорически не согласен с этим мнением и поэтому подготовил несколько практических приемов, которые потенциально могут пригодится для оптимизации в Вашем приложении. Хочу сразу отметить, что не все из данных приемов могут применяться сразу во время разработки. Для придания большего драматизма, все расчеты и цифры будут приводится для 64-х разрядной HotSpot JVM.<br/>
<br/>
<h6>Денормализация модели</h6><br/>
Итак, давайте рассмотрим следующий код:<br/>
<pre><code class="java">class Cursor {
    String icon;
    Position pos;
    Cursor(String icon, int x, int y) {
         this.icon = icon;
         this.pos = new Position(x, y);
    }
}
class Position {
    int x;
    int y;
    Position(int x, int y) {
        this.x = x;
        this.y = y;
    }
}
</code></pre><br/>
А теперь проведем денормализацию:<br/>
<pre><code class="java">class Cursor2 {
    String icon;
    int x;
    int y;
    Cursor2(String icon, int x, int y) {
        this.icon = icon;
        this.x = x;
        this.y = y;
    }
}
</code></pre><br/>
Казалось бы — избавились от композиции и все. Но нет. Объект класса Cursor2 потребляет приблизительно на 20% меньше памяти чем объект класса Cursor (по сути Cursor + Position). Такое вот не очевидное следствие декомпозиции. За счет ссылки и заголовка лишнего объекта. Возможно это кажется не важным и смешным, но только до тех пор, пока объектов у Вас мало, а когда счет идет на миллионы ситуация кардинально меняется. Это не призыв к созданию огромных классов по 100 полей. Ни в коем случаем. Это может пригодится исключительно в случае, когда Вы вплотную подошли к верхней границе Вашей оперативной памяти и в памяти у Вас много однотипных объектов.<br/>
<div class="habracut"> <a class="habracut" href="http://habrahabr.ru/blogs/java/136883/#habracut">Читать дальше &rarr;</a> </div>]]></description>
		
		<pubDate>Wed, 08 Feb 2012 11:32:12 GMT</pubDate>
		<author>doom369</author>
		<category>java</category><category>compressed references</category><category>размер объекта</category><category>оптимизация</category>
	</item>
	
	
	
	
	
	

	
		
	<item>		
		<title><![CDATA[JAVA / [Из песочницы] Java DNS API, Wikipedia и twitter-марафон в одном флаконе]]></title>
		<guid isPermaLink="true">http://habrahabr.ru/blogs/java/137721/</guid>
		<link>http://habrahabr.ru/blogs/java/137721/</link>			
		<description><![CDATA[Некоторое время назад я решал задачу автоматической покупки домена. Нужно было оформить в виде библиотеки (jar и файл настроек), которая использовалась бы в корпоративном приложении на Java. Я начал поиски DNS провайдеров с public API. Желательно, чтобы API были попроще, и домены подешевле — такой баланс оказалось не просто найти. <div class="habracut"> <a class="habracut" href="http://habrahabr.ru/blogs/java/137721/#habracut">Читать дальше &rarr;</a> </div>]]></description>
		
		<pubDate>Mon, 06 Feb 2012 18:29:42 GMT</pubDate>
		<author>tekktan</author>
		<category>java</category><category>dns</category><category>twitter</category><category>wikipedia</category>
	</item>
	
	
	
	
	

	
	
		
	<item>		
		<title><![CDATA[JAVA / [PODCAST] «Разбор полетов» — episode 9 — Индусоустойчивость]]></title>
		<guid isPermaLink="true">http://habrahabr.ru/blogs/java/137658/</guid>
		<link>http://habrahabr.ru/blogs/java/137658/</link>
		<description><![CDATA[Творческий коллектив редакции подкаста «Разбор полетов» представляет вашему вниманию очередной девятый выпуск разговорно-болтологического IT-тематического подкаста;.<br/>
В&nbsp;этом выпуске:<br/>
<div class="habracut"> <a class="habracut" href="http://habrahabr.ru/blogs/java/137658/#habracut">Читать дальше &rarr;</a> </div>]]></description>
		
		<pubDate>Mon, 06 Feb 2012 02:01:35 GMT</pubDate>
		<author>gAmUssA</author>
		<enclosure url="http://moscow-nthost3a.cdn.rpod.ru/00/00/01/01/92/262437-225173/Episode_9_Season_1.mp3?play=1" type="audio/mpeg" />
		<category>java</category><category>scala</category><category>actors</category><category>akka</category><category>ejb</category><category>github</category><category>profiler</category><category>plumbr</category><category>testing</category><category>разбор-полетов</category>
	</item>
	
	
	
	

		
	<item>		
		<title><![CDATA[JAVA / Тестирование в Java. Spock Framework]]></title>
		<guid isPermaLink="true">http://habrahabr.ru/blogs/java/137561/</guid>
		<link>http://habrahabr.ru/blogs/java/137561/</link>			
		<description><![CDATA[<img align="left" src="http://habrastorage.org/storage2/9a8/94f/3cc/9a894f3cc2204d959c37766c57cbd806.png"/><br/>
В предыдущих статьях на примерах <a href="http://habrahabr.ru/blogs/java/120101/">JUnit</a> и <a href="http://habrahabr.ru/blogs/java/121234/">TestNG</a> я упоминал о <a href="http://ru.wikipedia.org/wiki/Разработка_через_тестирование">test-driven development(TDD)</a> и <a href="http://en.wikipedia.org/wiki/Data-driven_testing">data-driven testing(DDT)</a>. Но есть еще один активно набирающий популярность подход, <a href="http://en.wikipedia.org/wiki/Behavior_Driven_Development">behaviour-driven development(BDD)</a>. Это такое развитие TDD техники, при котором на тест смотрят не как на тестирование каких-то компонентов системы, а как на требования к функционалу. Если TDD оперирует такими понятиями, как тест или метод, то для BDD это спецификация и требования. Про эту технику уже говорили на хабре ранее: <br/>
<ul>
<li><a href="http://habrahabr.ru/blogs/tdd/107262/">Эволюция юнит-теста</a>, </li>
<li><a href="http://habrahabr.ru/blogs/testing/52929/">Экстремальное программирование, знакомство с Behavior Driven Development и RSpec</a></li>
</ul><br/>
Этот подход применим используя и JUnit, и TestNG. Но есть и другие инструменты заточенные именно под BDD. В этой статье я расскажу про такой фреймворк. Называется он <a href="http://code.google.com/p/spock/">Spock Framework</a> и сочетает в себе не только принципы BDD, но и достоинства <a href="http://groovy.codehaus.org/">Groovy</a>. Да-да, именно Groovy. И хотя используется Groovy, используется он и для тестирования Java кода. Примерами использования могут служить Spring, Grails, Tapestry5. Интересно? Тогда читаем дальше.<br/>
<div class="habracut"> <a class="habracut" href="http://habrahabr.ru/blogs/java/137561/#habracut">Читать дальше &rarr;</a> </div>]]></description>
		
		<pubDate>Sun, 05 Feb 2012 20:52:33 GMT</pubDate>
		<author>sody</author>
		<category>tdd</category><category>bdd</category><category>behavour driven development</category><category>testing</category><category>spock</category><category>groovy</category><category>java</category>
	</item>
	
	
	
	
	
	

	
		
	<item>		
		<title><![CDATA[JAVA / [Из песочницы] SOAP-сервер на Java при участии Apache CXF и Spring]]></title>
		<guid isPermaLink="true">http://habrahabr.ru/blogs/java/137543/</guid>
		<link>http://habrahabr.ru/blogs/java/137543/</link>			
		<description><![CDATA[<img src="http://habrastorage.org/storage2/630/214/588/6302145888c2e1b675b27534d9bc959e.png" alt="image" align="left"/>За последнее время появилось <a href="http://habrahabr.ru/tag/soap/">несколько статей</a>, рассказывающих о протоколе <abbr title="Simple Object Access Protocol">SOAP</abbr>, а также описывающих процесс создания сервера на различных языках и платформах. Продолжим тему. В этой статье будет описываться создание сервера на языке Java с использование Apache CXF и Spring Framework. Предполагается, что читатель уже имеет общее представление об упомянутом протоколе, а также о работе с ant и maven. Для того, чтобы сделать задачу немного интереснее, добавим начальное условие: дана <abbr title="Web Services Definition Language">WSDL</abbr>-схема, описывающая веб-сервис. Итак…<br/>
(Картинка из статьи на <a href="http://ru.wikipedia.org/wiki/SOAP">Wikipedia</a>.)<br/>
<div class="habracut"> <a class="habracut" href="http://habrahabr.ru/blogs/java/137543/#habracut">Читать дальше &rarr;</a> </div>]]></description>
		
		<pubDate>Fri, 03 Feb 2012 09:13:56 GMT</pubDate>
		<author>artspb</author>
		<category>soap</category><category>wsdl</category><category>java</category><category>cxf</category><category>spring framework</category><category>ant</category><category>maven</category><category>tomcat</category><category>soapui</category><category>idea</category>
	</item>
	
	
	
	
	

		
	<item>		
		<title><![CDATA[JAVA / Swing. Десять полезных простых вещей]]></title>
		<guid isPermaLink="true">http://habrahabr.ru/blogs/java/137347/</guid>
		<link>http://habrahabr.ru/blogs/java/137347/</link>			
		<description><![CDATA[<img src="http://docs.oracle.com/javase/tutorial/images/ThinkingDuke.png" alt="image" align="right"/><br/>
<br/>
Хочу поделиться недавним опытом разработки апплетов на <a href="http://ru.wikipedia.org/wiki/Swing">Swing</a> и рассказать про подводные камни, приемы найденные и использованные в процессе работы. <br/>
<br/>
<div class="habracut"> <a class="habracut" href="http://habrahabr.ru/blogs/java/137347/#habracut">Читать дальше &rarr;</a> </div>]]></description>
		
		<pubDate>Wed, 01 Feb 2012 02:49:47 GMT</pubDate>
		<author>Akvel</author>
		<category>java</category><category>swing</category><category>applet</category>
	</item>
	
	
	
	
	
	

	
		
	<item>		
		<title><![CDATA[JAVA / [Из песочницы] JTable и Serializable или таблицы в Java и танцы с бубном при сохранении объектов в файлы]]></title>
		<guid isPermaLink="true">http://habrahabr.ru/blogs/java/137352/</guid>
		<link>http://habrahabr.ru/blogs/java/137352/</link>			
		<description><![CDATA[<h4>Введение</h4><br/>
Так получилось, что как дизайнеру, мне необходим простор для творчества при реализации любых зачач в написании программ. Давно я положил глаз на такую платформу как Java, так-как всегда мечтал о кроссплатформенном программном обеспечении. И вот недавно, я решил освоить такой прекрассный компонент в Java, как JTable, ну и по той причине, что всегда любил использовать таблицы в своих программах.<br/>
<br/>
В общем, я поставил перед собой не сложную задачу — создать таблицу, которую мог бы сохранять в файл как объект и паралельно отслеживать введенные пользователем данные подсвечивая ошибки и упрощая общение с таблицей моей программы путем подсвечивания наиболее важных элементов таблицы. Так-как я сторонник программирования по принципу пошаговой отладки при написании кода, наличие готовых кусков стабильного кода в сети Интернет, было для меня очень важным… Но… После тщательных поисков, экспериментально было установлено<div class="habracut"> <a class="habracut" href="http://habrahabr.ru/blogs/java/137352/#habracut">Читать дальше &rarr;</a> </div>]]></description>
		
		<pubDate>Tue, 31 Jan 2012 13:30:02 GMT</pubDate>
		<author>aosnec</author>
		<category>Java</category><category>JTable</category><category>MVC</category><category>TableCellRenderer</category><category>JLabel</category><category>Object</category><category>Serializable</category><category>isSelected</category><category>aosnec</category><category>сериализация</category><category>таблица</category>
	</item>
	
	
	
	
	

	
	
		
	<item>		
		<title><![CDATA[JAVA / [PODCAST] «Разбор полетов» — episode 8 — Много смеха и улыбок]]></title>
		<guid isPermaLink="true">http://habrahabr.ru/blogs/java/137262/</guid>
		<link>http://habrahabr.ru/blogs/java/137262/</link>
		<description><![CDATA[Творческий коллектив редакции подкаста «Разбор полетов» представляет вашему вниманию очередной восьмой выпуск разговорно-болтологического IT-тематического подкаста «Разбор полетов».<br/>
В&nbsp;этом выпуске:<br/>
<ul>
<li>Останови мыло!!! Stop SOAP <a href="http://stopsoap.com/">http://stopsoap.com/</a></li>
<li>Если у&nbsp;тебя есть фонтан, заткни его; дай отдохнуть и&nbsp;фонтану ©&nbsp;К.&nbsp;Прутков. Алгоритм не&nbsp;фонтан <a href="http://blog.notdot.net/2012/01/Damn-Cool-Algorithms-Fountain-Codes">http://blog.notdot.net/2012/01/Damn-Cool-Algorithms-Fountain-Codes</a></li>
<li>Полезняшка&nbsp;&mdash; <a href="http://www.latencytop.org/">http://www.latencytop.org/</a></li>
<li>Называйся правильно&nbsp;&mdash; <a href="http://vanillajava.blogspot.com/2012/01/generic-class-names-to-avoid.html">http://vanillajava.blogspot.com/2012/01/generic-class-names-to-avoid.html</a></li>
<li>Украл&nbsp;&mdash; выпил&nbsp;&mdash; в&nbsp;тюрьму. Романтика! <a href="http://gigaom.com/2012/01/07/desantis-startups-crime-boss/">http://gigaom.com/2012/01/07/desantis-startups-crime-boss/</a></li>
<li>«Товарищи призывники! Надо понимать всю глубину наших глубин» <a href="http://stackoverflow.com/questions/1012402/maven2-property-that-indicates-the-parent-directory">http://stackoverflow.com/questions/1012402/maven2-property-that-indicates-the-parent-directory </a></li>
</ul><br/>
p.s. Спецкорр подкаста <a href="http://twitter.com/a_abashev">@a_abashev</a> разыскивает израильских спецов для записи спецвыпуска на&nbsp;Земле обетованной. Подробности в&nbsp;выпуске<br/>
<br/>
<div class="habracut"> <a class="habracut" href="http://habrahabr.ru/blogs/java/137262/#habracut">Читать дальше &rarr;</a> </div>]]></description>
		
		<pubDate>Mon, 30 Jan 2012 08:20:41 GMT</pubDate>
		<author>aib</author>
		<enclosure url="http://moscow-nthost3a.cdn.rpod.ru/00/00/01/01/92/261718-224372/Episode_8_season_1.mp3" type="audio/mpeg" />
		<category>soap</category><category>wsdl</category><category>rest</category><category>xml-rpc</category><category>algorithms</category><category>java</category><category>maven</category><category>intel</category><category>top</category><category>stackoverflow</category><category>разбор-полетов</category><category>разбор полетов</category>
	</item>
	
	
	
	

		
	<item>		
		<title><![CDATA[JAVA / Будни программиста или редкий случай ошибки в компиляторе]]></title>
		<guid isPermaLink="true">http://habrahabr.ru/blogs/java/137243/</guid>
		<link>http://habrahabr.ru/blogs/java/137243/</link>			
		<description><![CDATA[Имеем следующий код:<br/>
<br/>
<pre><code class="java">1    class A {
2        
3     private B line;
4   
5     public void foo() {
6       for (Integer line : line.getElements()) {
7    
8       }
9     }
10    }
11    
12    class B {
13    
14      List&lt;Integer&gt; getElements() {
15         return null; // doesn't matter
16      }
17    }
</code></pre><br/>
<br/>
Вопрос: скомпилируется ли код?<br/>
Ответ: должен, но не будет<br/>
<br/>
<div class="habracut"> <a class="habracut" href="http://habrahabr.ru/blogs/java/137243/#habracut">Читать дальше &rarr;</a> </div>]]></description>
		
		<pubDate>Sun, 29 Jan 2012 16:47:53 GMT</pubDate>
		<author>dzigoro</author>
		<category>java</category><category>спецификации</category><category>компиляторы</category>
	</item>
	
	
	
	
	
	

		
	<item>		
		<title><![CDATA[JAVA / Multithreading in practice]]></title>
		<guid isPermaLink="true">http://habrahabr.ru/blogs/java/137065/</guid>
		<link>http://habrahabr.ru/blogs/java/137065/</link>			
		<description><![CDATA[Нашел как-то на stack overflow вопрос (<a href="http://stackoverflow.com/questions/7499203/java-multithreaded-file-system-tree-traversal">link</a>).<br/>
 <code> Need to create java CLI programm that searchs for specific files matched some pattern. Need to use multi-threading approach without using util.concurrent package and to provide good performance on parallel controllers. </code><br/>
 Перевод<br/>
 <code> Нужно написать консольную программу, которая ищет файлы по какому-то паттерну. Программа должна быть многопоточная, но нельзя использовать пакет util.concurrent. Требуется добиться максимальной производительности.<br/>
 </code><br/>
<br/>
В общем идея в принципе была не сложная. Т.к. по условию нельзя использовать util.concurrent, то надо реализовать свой пул потоков, плюс написать какие-то таски, которые в этом пуле потоков будут крутиться. <br/>
 Так же я не был уверен в том, что при многопоточном использовании IO будет увеличение производительности.<br/>
 <div class="habracut"> <a class="habracut" href="http://habrahabr.ru/blogs/java/137065/#habracut">Читать дальше &rarr;</a> </div>]]></description>
		
		<pubDate>Thu, 26 Jan 2012 13:25:06 GMT</pubDate>
		<author>culvert</author>
		<category>java</category><category>multithreading</category>
	</item>
	
	
	
	
	
	

	
		
	<item>		
		<title><![CDATA[JAVA / [Из песочницы] Из Басры в Рим. Преобразовываем арабские числа в римские]]></title>
		<guid isPermaLink="true">http://habrahabr.ru/blogs/java/136646/</guid>
		<link>http://habrahabr.ru/blogs/java/136646/</link>			
		<description><![CDATA[Доброе время суток, Хабраюзер. <br/>
<br/>
Разрабатывая в основном для платформы J2ME, я всегда старался вносить какие то изюминки в свои проекты. Так, однажды, мне понадобилось выделить пункты меню.<br/>
<br/>
Стандартное решение, через тире или пронумеровав их, использовать не очень хотелось, но другие варианты тогда у меня отсутствовали. Обдумывая как бы лучше оформить эти пункты, я случайно наткнулся на свою старую школьную тетрадку по истории, в которой пункты были пронумерованы с использованием римских цифр. Бинго!<br/>
<br/>
Стоит признаться, на то время моих познаний в римских цифрах хватало только для подсчета до второго-третьего десятка. Что вообще то для нумерации пунктов должно было хватить. Но как любой программист, захотелось иметь готовое решение, которое смогло бы переводить любые целые десятичные арабские числа в эквивалентные им римские.<br/>
<div class="habracut"> <a class="habracut" href="http://habrahabr.ru/blogs/java/136646/#habracut">Читать дальше &rarr;</a> </div>]]></description>
		
		<pubDate>Fri, 20 Jan 2012 10:51:55 GMT</pubDate>
		<author>SergejKomlach</author>
		<category>римские цифры</category><category>java</category><category>j2me</category><category>алгоритмы</category>
	</item>
	
	
	
	
	

		
	<item>		
		<title><![CDATA[JAVA / JMock и EasyMock: сравнение и howto в примерах и не только]]></title>
		<guid isPermaLink="true">http://habrahabr.ru/blogs/java/136466/</guid>
		<link>http://habrahabr.ru/blogs/java/136466/</link>			
		<description><![CDATA[<img src="http://habrastorage.org/storage2/628/9d0/7a6/6289d07a6667adaf90e0ad656eea3d7d.jpg" align="left"/> Практически ни для кого не секрет, что при тестировании кода, использующего какие-то внешние компоненты, часто применяют подход mock-объектов. Для тех, кто всё же о нём не знает, кратко поясню: это такие объекты, которые имеют тот же интерфейс, что и используемые компоненты, но их поведение полностью задаётся в тесте, и их использование позволяет избежать поднятия полной инфраструктуры, необходимой приложению для запуска. Что ещё более важно, можно легко и непринуждённо проконтролировать, что код вызывал те или иные методы у mock-объекта с теми или иными аргументами.<br/>
<br/>
В этой статье я проведу сравнительный анализ двух распространённых в Java библиотек для работы с mock'ами: <a href="http://easymock.org/">EasyMock</a> и <a href="http://www.jmock.org/">JMock</a>. Для осознания достаточно базового знания <a href="http://junit.org/">JUnit</a>, а после прочтения этой статьи у вас будет весьма хорошее представление о том, как пользоваться обеими этими библиотеками.<div class="habracut"> <a class="habracut" href="http://habrahabr.ru/blogs/java/136466/#habracut">Читать дальше &rarr;</a> </div>]]></description>
		
		<pubDate>Thu, 19 Jan 2012 23:15:52 GMT</pubDate>
		<author>gvsmirnov</author>
		<category>easymock</category><category>jmock</category><category>unit testing</category><category>junit</category><category>mock</category>
	</item>
	
	
	
	
	
	

		
	<item>		
		<title><![CDATA[JAVA / Hibernate Cache. Практика]]></title>
		<guid isPermaLink="true">http://habrahabr.ru/blogs/java/136375/</guid>
		<link>http://habrahabr.ru/blogs/java/136375/</link>			
		<description><![CDATA[Итак, в продолжение <a href="http://habrahabr.ru/blogs/java/135176/">предыдущей статьи</a> я попробую на реальных ситуациях рассказать о проблемах, которые возникали у меня при работе в реальных проектах.<br/>
<br/>
<h5>Миграционные скрипты</h5><br/>
Пожалуй, одной из наиболее частых проблем при работе с кешем в моем приложении является необходимость накатывать миграционные скрипты на работающий сервер. Ведь если эти скрипты запускаются не через фабрику сессий работающего сервера, то кеш этой фабрики никак не узнает об изменениях, которые делаются в базу. Следовательно, получаем проблему несовместимости данных. Для решения этой проблемы есть несколько путей:<br/>
<ol>
<li>Рестарт сервера — самый простой и, обычно, самый не приемлемый способ;</li>
<li>Очистка кеша через определенные механизмы — пожалуй самый оптимальный по простоте и надежности метод. Этот метод можно вынести, например в JMX, на веб страничку или другой интерфейс и вызывать при необходимости. Гибкость метода в том, что пишется это один раз, а используется сколько угодно и где угодно. В случае, если Ваш провайдер кеша — EHCache и класс провайдер — SingletonEhCacheProvider, то Ваш код может выглядеть так:<br/>
<pre><code class="java">public String dumpKeys() {
    String regions[] = CacheManager.getInstance().getCacheNames();
    StringBuilder allkeys = new StringBuilder();
    String newLine = System.getProperty(&quot;line.separator&quot;);
    for (String region : regions) {
        Ehcache cache = CacheManager.getInstance().getEhcache(region);
        allkeys.append(toSomeReadableString(cache.getKeys()));
        allkeys.append(newLine);
    }
    return allkeys.toString();
}
</code></pre><br/>
Естественно что этот код должен выполняться в том же процессе что и хибернейт, статистику которого Вы хотите отследить. Подробней можно прочитать <a href="http://ehcache.org/documentation/recipes/">тут</a>. Того же можно добиться используя фабрику сессий.<br/>
</li>
<li>Запуск миграционных скриптов, используя фабрику сессий работающего сервера. Это похоже на второй метод, с той лишь разницей, что мы не очищаем кеш, а пропускаем все миграционные скрипты через существующую фабрику. Таким образом все необходимые кеши обновляться сами. Этот метод рационально использовать в случае если кеш большой и дешевле его обновлять нежели создавать по новой;</li>
</ol><br/>
<div class="habracut"> <a class="habracut" href="http://habrahabr.ru/blogs/java/136375/#habracut">Читать дальше &rarr;</a> </div>]]></description>
		
		<pubDate>Thu, 19 Jan 2012 15:12:16 GMT</pubDate>
		<author>doom369</author>
		<category>java</category><category>hibernate cache</category><category>problems</category>
	</item>
	
	
	
	
	
	

	
	
		
	<item>		
		<title><![CDATA[JAVA / [PODCAST] Выпуск №72 — The Art Of Programming [ Drinking ] Переезд в TEXAS]]></title>
		<guid isPermaLink="true">http://habrahabr.ru/blogs/java/136488/</guid>
		<link>http://habrahabr.ru/blogs/java/136488/</link>
		<description><![CDATA[Все о переезде и жизни в TEXAS<br/>
Статистика по визам <a href="http://www.myvisajobs.com/">http://www.myvisajobs.com/</a><br/>
Форум <a href="http://forum.privet.com/viewforum.php?f=1">http://forum.privet.com/viewforum.php?f=1 </a><br/>
<img src="http://lh4.googleusercontent.com/-WAme2hLRNZo/TxZ9pwcSS1I/AAAAAAAACQo/o0CA3ntMzW8/s800/iconTAOP72-01.png"/><br/>
Cost-Based Oracle Fundamentals (Expert's Voice in Oracle) / Jonathan Lewis<br/>
<a href="http://www.amazon.com/Cost-Based-Oracle-Fundamentals-Experts-Voice/dp/1590596366/">http://www.amazon.com/Cost-Based-Oracle-Fundamentals-Experts-Voice/dp/1590596366/</a><br/>
<a href="http://www.ozon.ru/context/detail/id/2984086/">http://www.ozon.ru/context/detail/id/2984086/</a><br/>
<br/>
Контакты:<br/>
Michael <br/>
<a href="http://habrahabr.ru/users/zorkus/" class="user_link">zorkus</a><br/>
<a href="http://twitter.com/zorkus">http://twitter.com/zorkus</a><br/>
<br/>
golodnyj<br/>
G+ <a href="http://gplus.to/golodnyj">http://gplus.to/golodnyj</a><br/>
G+ <a href="http://gplus.to/TheArtOfProgramming">http://gplus.to/TheArtOfProgramming</a><br/>
podcast@golodnyj.ru]]></description>
		
		<pubDate>Wed, 18 Jan 2012 08:16:10 GMT</pubDate>
		<author>golodnyj</author>
		<enclosure url="http://rpod.ru/get/260516/223106/download/%D0%92%D1%8B%D0%BF%D1%83%D1%81%D0%BA_%E2%84%9672_%E2%80%94_The_Art_Of_Programming_%5B_Drinking_%5D_%D0%9F.mp3" type="audio/mpeg" />
		<category>golodnyj</category><category>the art of programming</category><category>texas</category><category>эмиграция</category>
	</item>
	
	
	
	

	
		
	<item>		
		<title><![CDATA[JAVA / [Из песочницы] Высокопроизводительный NIO-сервер на Netty]]></title>
		<guid isPermaLink="true">http://habrahabr.ru/blogs/java/136456/</guid>
		<link>http://habrahabr.ru/blogs/java/136456/</link>			
		<description><![CDATA[<h5>Преамбула</h5><br/>
Здравствуйте. Я являюсь главным разработчиком крупнейшего в СНГ сервера Minecraft (не буду рекламировать, кому надо, те знают). Уже почти год мы пишем свою реализацию сервера, рассчитанную на больше чем 40 человек (мы хотим видеть цифру в 500 хотя бы). Пока всё было удачно, но последнее время система начала упираться в то, что из-за не самой удачной реализации сети (1 поток на ввод, 1 на вывод + 1 на обработку), при 300 игроках онлайн работает более 980 потоков (+ системные), что в сочетании с производительностью дефолтного io Явы даёт огромное падение производительности, и уже при 100 игроках сервер в основном занимается тем, что пишет/читает в/из сети.<br/>
<br/>
Поэтому я решила переходить на NIO. В руки совершенно случайно попала библиотека <a href="http://www.jboss.org/netty">Netty</a>, структура которой показалась просто идеально подходящей для того, чтобы встроить её в уже готовое работающее решение. К сожалению, мануалов по Netty мало не только на русском, но и на английском языках, поэтому приходилось много экспериментировать и лазить в код библиотеки, чтобы найти лучший способ.<br/>
<br/>
Здесь я постараюсь расписать серверную часть работы с сетью через Netty, может быть это кому-то будет полезно.<div class="habracut"> <a class="habracut" href="http://habrahabr.ru/blogs/java/136456/#habracut">Читать дальше &rarr;</a> </div>]]></description>
		
		<pubDate>Tue, 17 Jan 2012 18:10:09 GMT</pubDate>
		<author>Rena4ka</author>
		<category>java</category><category>netty</category><category>server</category><category>nio</category><category>highload</category>
	</item>
	
	
	
	
	

		
	<item>		
		<title><![CDATA[JAVA / Java performance hackzone @ JavaDay SPB 2012]]></title>
		<guid isPermaLink="true">http://habrahabr.ru/blogs/java/136361/</guid>
		<link>http://habrahabr.ru/blogs/java/136361/</link>			
		<description><![CDATA[Привет,<br/>
<br/>
Вслед за <a href="http://habrahabr.ru/blogs/java/136356/">анонсом</a> JavaDay в Питере, хотим проанонсировать отдельную его часть. Сделаем это в отдельном топике, чтобы не засорять оригинальный анонс. <br/>
<br/>
В этом году мы пробуем часть нового формата. В течение дня будет работать Performance Hackzone, куда можно будет придти со своими конкретными проблемами с производительностью и поговорить с инженерами, работающими над производительностью Java'ы. Мы знаем, что у вас (и у нас) есть проблемы, и мы готовы их обсуждать. На предыдущем московском J1 мы с <a href="http://habrahabr.ru/users/walrus/" class="user_link">Walrus</a> только этим и занимались все два дня конференции, настало время эту традицию логистически оформить.<br/>
<br/>
Опыт показывает, что продуктивные дискуссии случаются тогда, когда спрашивающие имеют на руках конкретный код, а не тратят 15 минут только на описание проблемы. Если код будет достаточно изолированным и самостоятельным, чтобы успешно компилироваться и запускаться, его можно будет поанализировать и покрутить прямо на месте. Идеально иметь минимальный проект, собираемый Maven'ом или Ant'ом. В идеале покрутить захочется и вам, поэтому берите с собой ноутбуки.<br/>
<br/>
В этом топике можно задавать организационные вопросы, дополнительные предложения по формату (вдруг мы их успеем осуществить до конференции?) и т.п. <br/>
<br/>
<b>Call for action: </b>Поскольку мы с трудом понимаем, сколько человек нас посетит, пожалуйста <a href="http://tinyurl.com/6rzpehp">скиньте нам коротенькое письмо</a> «я приду», и опционально, с <i>кратким</i> описанием проблемы.<br/>
<br/>
До встречи!]]></description>
		
		<pubDate>Mon, 16 Jan 2012 15:09:49 GMT</pubDate>
		<author>TheShade</author>
		<category>javaday</category><category>java performance</category><category>конференция</category>
	</item>
	
	
	
	
	
	

		
	<item>		
		<title><![CDATA[JAVA / Hibernate cache]]></title>
		<guid isPermaLink="true">http://habrahabr.ru/blogs/java/135176/</guid>
		<link>http://habrahabr.ru/blogs/java/135176/</link>			
		<description><![CDATA[Довольно часто в java приложениях с целью снижения нагрузки на БД используют кеш. Не много людей реально понимают как работает кеш под капотом, добавить просто аннотацию не всегда достаточно, нужно понимать как работает система. Поэтому этой статье я попытаюсь раскрыть тему про то, как работает кеш популярного ORM фреймворка. Итак, для начала немного теории.<br/>
<br/>
Прежде всего Hibernate cache — это 3 уровня кеширования:<br/>
<ul>
<li> Кеш первого уровня (First-level cache);</li>
<li> Кеш второго уровня (Second-level cache);</li>
<li> Кеш запросов (Query cache);</li>
</ul><br/>
<h5>Кеш первого уровня</h5><br/>
Кеш первого уровня всегда привязан к объекту сессии. Hibernate всегда по умолчанию использует этот кеш и его нельзя отключить. Давайте сразу рассмотрим следующий код:<br/>
<pre><code class="java">SharedDoc persistedDoc = (SharedDoc) session.load(SharedDoc.class, docId);
System.out.println(persistedDoc.getName());
user1.setDoc(persistedDoc);

persistedDoc = (SharedDoc) session.load(SharedDoc.class, docId);
System.out.println(persistedDoc.getName());
user2.setDoc(persistedDoc);
</code></pre><br/>
Возможно, Вы ожидаете, что будет выполнено 2 запроса в БД? Это не так. В этом примере будет выполнен 1 запрос в базу, несмотря на то, что делается 2 вызова load(), так как эти вызовы происходят в контексте одной сессии. Во время второй попытки загрузить план с тем же идентификатором будет использован кеш сессии. <br/>
Один важный момент — при использовании метода load() Hibernate не выгружает из БД данные до тех пор пока они не потребуются. Иными словами — в момент, когда осуществляется первый вызов load, мы получаем прокси объект или сами данные в случае, если данные уже были в кеше сессии. Поэтому в коде присутствует getName() чтобы 100% вытянуть данные из БД. Тут также открывается прекрасная возможность для потенциальной оптимизации. В случае прокси объекта мы можем связать два объекта не делая запрос в базу, в отличии от метода get(). При использовании методов save(), update(), saveOrUpdate(), load(), get(), list(), iterate(), scroll() всегда будет задействован кеш первого уровня. Собственно, тут нечего больше добавить.<br/>
<div class="habracut"> <a class="habracut" href="http://habrahabr.ru/blogs/java/135176/#habracut">Читать дальше &rarr;</a> </div>]]></description>
		
		<pubDate>Mon, 16 Jan 2012 14:48:42 GMT</pubDate>
		<author>doom369</author>
		<category>java</category><category>cache</category><category>hibernate</category><category>first-level cache</category><category>second-level cache</category>
	</item>
	
	
	
	
	
	

	
		
	<item>		
		<title><![CDATA[JAVA / [Из песочницы] Слабые ссылки в Java и утечка памяти]]></title>
		<guid isPermaLink="true">http://habrahabr.ru/blogs/java/136136/</guid>
		<link>http://habrahabr.ru/blogs/java/136136/</link>			
		<description><![CDATA[Для того чтоб сборщик муссора освобождал память выделенную под обьекты, которые уже не используются программой, важно соблюдение условия: логическое время жизни обьекта (период пока приложение использует обьект) и фактическое время существования незавершенных связей с этим объектом было одинаковым. Зачастую нам не нужно уделять много внимания на время жизни обьекта, JVM сама занимается этим. Но время от времени мы создаем ссылку, которая удерживает объект в памяти дольше, чем ожидалось.<br/>
<div class="habracut"> <a class="habracut" href="http://habrahabr.ru/blogs/java/136136/#habracut">Читать дальше &rarr;</a> </div>]]></description>
		
		<pubDate>Fri, 13 Jan 2012 08:44:48 GMT</pubDate>
		<author>obie</author>
		<category>java</category><category>утечки памяти</category><category>слабые ссылки</category><category>weak reference</category>
	</item>
	
	
	
	
	

	
		
	<item>		
		<title><![CDATA[JAVA / [Из песочницы] Dependency injection в Java EE 6]]></title>
		<guid isPermaLink="true">http://habrahabr.ru/blogs/java/136140/</guid>
		<link>http://habrahabr.ru/blogs/java/136140/</link>			
		<description><![CDATA[В рамках JSR-299 “Contexts and Dependency Injection for the Java EE platform” (ранее WebBeans) была разработана спецификация описывающая реализацию паттерна внедрения зависимости, включенная в состав Java EE 6. Эталонной реализацией является фреймворк Weld, о котором и пойдет речь в данной статье.<br/>
<br/>
К сожалению в сети не так много русскоязычной информации о нем. Скорее всего это связано с тем, что Spring IOC является синонимом dependency injection в Java Enterprise приложениях. Есть конечно еще Google Guice, но он тоже не так популярен.<br/>
<br/>
В статье хотелось бы рассказать об основных преимуществах и недостатках Weld.<div class="habracut"> <a class="habracut" href="http://habrahabr.ru/blogs/java/136140/#habracut">Читать дальше &rarr;</a> </div>]]></description>
		
		<pubDate>Fri, 13 Jan 2012 08:11:55 GMT</pubDate>
		<author>bean</author>
		<category>java</category><category>javaee</category><category>ioc контейнеры</category><category>cdi</category><category>weld</category>
	</item>
	
	
	
	
	

	

	
	
	
	
	
</channel>
</rss>

