nkoksharov.blogspot.com Open in urlscan Pro
172.217.165.129  Public Scan

URL: https://nkoksharov.blogspot.com/
Submission: On January 26 via api from US — Scanned from US

Form analysis 1 forms found in the DOM

GET http://nkoksharov.reformal.ru/proj/

<form target="_blank" action="http://nkoksharov.reformal.ru/proj/" method="get"><input type="hidden" name="charset" value="utf-8">
  <fieldset>
    <div class="i_prop">Я предлагаю вам...</div><input id="bulbulh" name="idea" type="text"><input type="submit" value="" id="adihet">
  </fieldset>
</form>

Text Content

skip to main | skip to sidebar
Komatsu D575 — самый крупный
бульдозер на планете


JAVA-BULLDOZER



"Nothing irks me more than opening a base class or interface and getting that
ugly view of just the method names because source isn't available." (c) Howard
Lewis Ship


СУББОТА, 11 ЯНВАРЯ 2014 Г.


REDISSON - РАСПРЕДЕЛЕННЫЕ И МАСШТАБИРУЕМЫЕ СТРУКТУРЫ ДАННЫХ JAVA НА ОСНОВЕ
СЕРВЕРА REDIS


Опубликовал первый релиз проекта Redisson. Проект позволяет использвать знакомые
всем структуры данных Java (Set, List, Map, Queue, AtomicLong, Lock,
CountDownLatch), а также использовть функционал publish/subscribe в
распределенном виде с поддержкой масштабирования. Все это достигается благодаря
использованию весьма популярного сервера Redis, для которого Redisson является
лишь клиентом.

Вам даже не придется знать команды Redis-а, да и возможности вызова команд Redis
напрямую нет, т.к. цель проекта предоставить удобный api с использованием уже
известных Java-интерфейсов. Для выполнения вызовов на сервере Redis используется
пропаченный Redis-клиент - lettuce.

Представленный api по своей стуктуре в чем-то схож с Hazelcast api. Проект
Hazelcast может хранить данные только в памяти, что не всегда удобно и влияет на
надежность системы. Сервер Redis, в свою очередь, предоставляет три способа
хранения данных:
   1. только в памяти
   2. переодическое сохранение на диск (snapshotting) - используется
по-умолчанию
   3. лог транзакций, т.е. синхронная запись каждого изменения в лог
(append-only file)
Таким образом, благодаря возможностям сервера Redis, мы получаем распределенные
java структуры данных с возможностью хранения состояния не только в памяти.

Доступ к хранилищу Redis реализован практически для любого языка
программирования, благодаря большому количеству реализованных клиентов.
Соотвественно данные созданные в Redisson будут доступны для любого
Redis-клиента.

Изначально проект задумывался как простая попытка реализовать Map на Java через
Redis-команды. Однако дальнейшее изучение команд Redis, (в Redis есть поддержка
транзакций, hashes, lists, sets) навело на мысль о реализации более сложных
структур, таких как Lock и CountDownLatch.

В проекте более 70 unit-тестов, для запуска которых (по-умолчанию они отключены)
нужно запустить локально Redis-сервер и запустить maven-сборку с параметром
-DskipTest=false


ПРИМЕРЫ ИСПОЛЬЗОВАНИЯ:

Распределенный Map:


        Config config = new Config();
        config.setConnectionPoolSize(10);
        config.addAddress("some.redis-server.com:8291");
        Redisson redisson = Redisson.create(config);

        ConcurrentMap<String, SomeObject> map = redisson.getMap("anyMap");
        map.put("123", new SomeObject());
        map.putIfAbsent("323", new SomeObject());
        map.remove("123");

        ...

        redisson.shutdown();



Распределенный Lock:


        Redisson redisson = Redisson.create();

        Lock lock = redisson.getLock("anyLock");
        lock.lock();
        lock.unlock();

        // или

        redisson.getLock("anyLock").lock();

        ...

        redisson.getLock("anyLock").unlock();

        ...

        redisson.shutdown();



Автор: Никита Кокшаров на 18:41 1 коммент.
Ярлыки: distributed, java, netty, redis



ПЯТНИЦА, 25 МАЯ 2012 Г.


ПРОЕКТ HIBERNATE DYNAMIC SQL CACHE



Выложил на github проект Hibernate Dynamic SQL Cache.

ОПИСАНИЕ

Данный проект успешно используется мной в нескольких проектах и показал хорошую
эффективность. Причиной для создания проекта послужил неэффективный механизм
кэширования в Hibernate, впрочем сами разработчики открыто пишут об этом в
документации.

 * HQL-кэш, а также кэш коллекций entity-объектов будут сбрасываться при каждом
   обновлении данных в хотя бы в одной из таблиц, участвующих в запросе. При
   очень частых обновлениях таблиц польза от такого рода кэшей сводится к 0.
 * SQL-кэш держит в памяти лишь результат первого вызова запроса и не
   сбрасывается.



Поэтому возникла идея создания динамически обновляемого кэша. Результат запроса
обновляется при INSERT или DELETE объекта в базе. Для использования данного
решения следует немного изменить подход к построению запросов, а также
использованию различных коллекций внутри entity-объектов.

 * Запрос должен возвращать только id объекта. По этому id вы можете легко
   загрузить объект из кэша. (Таким образом получается два обращения к кэшу, что
   всегда быстрее выполнения запросов к базе)
 * Запрос должен быть только по неизменяемым полям объекта.
 * Вместо использования коллекций в entity-объекте использовать соответствующий
   SQL-запрос c динамическим обновлением.



Cache provider может использоваться абсолютно любой (Infinispan, Hazelcast,
EHCache ...)

Проект опубликован под Apache License 2.0

ПРИМЕР ИСПОЛЬЗОВАНИЯ

Для наглядности примера используется Spring, хотя сам проект не привязан к нему,
можно использовать любой другой контейнер.

Конфигурация hibernate. Здесь важно отметить использование собственного
hibernate.cache.query_cache_factory через который и осуществляется вся логика
управления обновлениями кэшей:

Регистрируем com.corundumstudio.hibernate.dsc.QueryCacheEntityListener который
будет отслеживать основные операции по всем entity.

Пример DAO-сервиса. com.corundumstudio.hibernate.dsc.CacheCallback - callback
через который будет обслуживать операции "insert" или "delete" на объекте (в
данном примере SimpleEntity), чтобы результаты запроса были всегда "свежими".

Теперь при вызове SimpleEntityDao.getEntityByPhone, первый раз будет произведено
обращение к БД. Последующие вызовы метода будут возвращать значение из кэша,
причем если объект SimpleEntity с искомым значением phone будет добавлен в базу
он также появится и в результате данного запроса. И наоборот, если объект с
таким значением phone будет удален, то результат запроса будет возвращать null

Если результат запроса возвращает список объектов, то в этом случае, при
удалении/создании объекта, в списке будет удаляться/добавляться его id


Автор: Никита Кокшаров на 12:12 0 коммент.
Ярлыки: cache, hibernate, tool



ПЯТНИЦА, 13 АПРЕЛЯ 2012 Г.


BONECP - ПРОИЗВОДИТЕЛЬНЫЙ ПУЛ СОЕДИНЕНИЙ ДЛЯ БД



BoneCP - библиотека управления соединениями с БД. Использую ее уже более 2-х лет
в разных проектах, в том числе и в системах с нагрузкой. Автор позиционирует ее
как более производительную замену библиотекам c3p0 и dbcp. Представленные им
бенчмарки это только подтверждают.


Среди полезных возможностей можно отметить:

 * логирование всех sql-операций

 * доступ к статистике через JMX

 * кэширование PreparedStatement-ов


Автор: Никита Кокшаров на 20:42 6 коммент.
Ярлыки: bonecp, tool



ЧЕТВЕРГ, 12 ЯНВАРЯ 2012 Г.


ПОДДЕРЖКА SOCKET.IO ПРОТОКОЛА НА JAVA



Опубликовал свой первый проект на github - netty-socketio, реализующий серверную
поддержку socket.io протокола на java. В основе использован легендарный
фреймворк Netty.

Socket.io - библиотека предназначенная для создания постоянной связи браузера с
сервером. Таким образом возможно организовывать доставку данных в реальном
времени в обе стороны. Socket.io поддерживает несколько транспортных механизмов
для организации такого взаимодействия - web-sockets, xhr-polling и т.д.

В моей реализации поддерживается socket.io-client версии 0.8.7+. Из
поддерживаемых транспортов пока только xhr-polling и websocket.


Автор: Никита Кокшаров на 16:16 0 коммент.
Ярлыки: netty, network, socketio



СРЕДА, 2 МАРТА 2011 Г.


SMOOKS: ПАРСИМ XML С ПОМОЩЬЮ ... XML



Smooks - отличный инструмент, который решает задачу парсинга xml используя
xml-маппинг тэгов и аттрибутов на объекты и их свойства. Вообще продукт
позиционируется как инструмент для трансформации, биндинга, валидации и
обработки данных в различных форматах (CSV, XML, EDI). Я рассматриваю этот
продукт как достойную альтернативу других механизмов парсинга xml - JAXB, JAXP,
Digester и пр.

Предположим нам надо распарсить такой вот xml:

Xml необходимо распарсить в List из объектов типа PlayerRole:

Для начала создадим xml-маппинг необходимый для преобразования данных в объекты:

В Smooks все метаданные, необходимые для парсинга участков xml, представляются в
виде бинов с сылками друг на друга. Адресация в xml осуществляется с помощью
xpath-выражений. Если при парсинге необходима какая-то пост-обработка данных
можно воспользоваться возможностью выполнения groovy-скриптов (тэг g:groovy),
при этом код работы с xml будет более лаконичн чем на java. Из groovy также
возможны обращение к бинам smooks.

Ну и наконец пример запуска механизма парсинга данных с приведенным конфигом:

Чтобы получить результат парсинга надо выбрать бин, обрабатывающий root-овый
тэг, в нашем случае это бин с id="roles-bean".

Я выбраю этот движок для разбора xml т.к. он почти не требует кода и
интегрирован с groovy. Использую его когда в проекте требуется распарсить
различные конфигурационные ресурсы на этапе запуска сервера.


Автор: Никита Кокшаров на 18:00 0 коммент.
Ярлыки: approach, xml



ПЯТНИЦА, 14 ЯНВАРЯ 2011 Г.


ИСПОЛЬЗОВАНИЕ JAVASSIST ДЛЯ ГЕНЕРАЦИИ ПРОКСИ В SPRING FRAMEWORK



Известно, что проект cglib давно находится в заброшенном состоянии, также при
работе с ним возникают некоторые проблемы, описанные здесь. Наиболее популярная
альтернатива этому проекту - javassist. Он используется в таких проектах как
JBoss AS, Hibernate, Weld ...

Только вот в Spring он еще не появился. Замена библиотеки cglib, используемой
для генерации proxy-объектов, на javassist, судя по плану проекта, состоится в
версии 3.1 проекта. Вот jira-таск. В этом же таске я прикрепил аттачи в виде
трех классов и пары патчей, которые позволяют окончательно перейти на Javassist.

Для включения поддержки Javassist вам понадобится пристроить к себе в проект вот
эти три класса - JavassistAopProxy, JavassistAopProxyFactory и
JavassistApplicationContext. Затем вместо spring-овой реализации
ApplicationContext-а задействовать
org.springframework.aop.framework.JavassistApplicationContext. Если вы не
создаете его напрямую, а используете
org.springframework.web.context.ContextLoaderListener сконфигурированный в
web.xml, то вам необоходимо будет добавить в этот же web.xml такие строки:



Автор: Никита Кокшаров на 18:00 0 коммент.
Ярлыки: spring javassist



СУББОТА, 6 НОЯБРЯ 2010 Г.


"ХОРОШАЯ" НОВОСТЬ ОТ ORACLE...



Хотя это событие было предсказуемо, после коммерциализации MySQL и OpenOffice,
верить в него не хотелось. Похоже oracle хочет разделить версии JVM на "free" и
"premium", подробнее тут.


Автор: Никита Кокшаров на 22:30 4 коммент.


Предыдущие Главная страница

Подписаться на: Сообщения (Atom)





АРХИВ БЛОГА

 * ▼  2014 (1)
   * ▼  января (1)
     * Redisson - распределенные и масштабируемые структу...

 * ►  2012 (3)
   * ►  мая (1)
   * ►  апреля (1)
   * ►  января (1)

 * ►  2011 (2)
   * ►  марта (1)
   * ►  января (1)

 * ►  2010 (6)
   * ►  ноября (2)
   * ►  октября (1)
   * ►  августа (1)
   * ►  апреля (1)
   * ►  марта (1)

 * ►  2009 (15)
   * ►  декабря (1)
   * ►  октября (1)
   * ►  августа (3)
   * ►  июля (1)
   * ►  мая (1)
   * ►  апреля (1)
   * ►  марта (1)
   * ►  февраля (4)
   * ►  января (2)

 * ►  2008 (18)
   * ►  декабря (3)
   * ►  ноября (5)
   * ►  октября (10)




ОБО МНЕ

Никита Кокшаров email: mr(подчеркивание)niko(at)inbox.ru Просмотреть профиль



ТЭГИ

 * aop
 * applet
 * approach
 * benchmark
 * blazeds
 * bonecp
 * browser
 * bug
 * bytecode
 * cache
 * database
 * distributed
 * event
 * expression
 * flex
 * funny
 * hibernate
 * html
 * http
 * instrumentation api
 * java
 * javascript
 * jvm
 * liquibase
 * logging
 * login
 * logout
 * maven
 * maven-plugin
 * my project
 * netty
 * network
 * nginx
 * performance
 * project managment
 * redis
 * socketio
 * spring
 * spring javassist
 * spring security
 * sql
 * tapestry
 * thought
 * tomcat
 * tool
 * transaction
 * xml




БЛОГИ

 * Блог сурового челябинского программиста
   [C++] Что такое warning C4291 и как с ним бороться
   5 лет назад
   
 * Java Specialist
   Android tricks
   9 лет назад
   
 * Non compos mentis
   Socket.IO for Erlang
   11 лет назад
   
 * Agahov's blog
   
   
 * Блог о Java технологиях
   
   
 * Developer's Things
   
   




ПОСТОЯННЫЕ ЧИТАТЕЛИ



Java-Bulldozer
Я предлагаю вам...