понедельник, 25 февраля 2013 г.

Ehcache as Distributed Cache

Фомарльно такой вид кеширования Ehcache называется Terracotta Distributed Ehcache.
Ehcache работает в среде Terracotta cluster.

Ehcache. Общие понятия

cache -- хранилище данных, которые могут понадобиться в ближайшем будущем, и доступ к ним может быть представлен очень быстро.
cache-hit -- условие когда мы обратились в кеш и записать там оказалась.
cache-miss -- условие когда мы обратились, но записи там не оказалось.
system-of-record (SOR) -- это место где мы в любом случае получим точно самое достоверное значение желаемой записи.

Большинство современных приложений развертываются на группе серверов паралельно для улучшения одновременного обслуживания  большого количества пользователей. Для такой среды Ehcache имеет две топологии:
1) Самостоятельная -- на конкретной ноде кеш не интересует дела его колег на соседних, и каждый работает сам. В такой топологии между нодами много несоответсвий в данных, она применима только если это для нас не критично.
2) Распределенный Ehcache (Distributed Cache) - данные кеша храняться в Terracotta Server Array, в подмасиве для каждой ноды, в этом случае если на одной ноде что-то было закешировано, то этим кешом смогут пользоваться все ноды. CacheManager-ы на разных JVM(и вообще нодах) могут разделять записи(элементы) между своими кешами.
3) Репликация - данные кеша сохраняются на ноде создателя записи и копируются, или инвалидируются, на других нодах кластера. Для этой топологии возможен только режим слабой связности, потому что он не предоставляет такой скорости распределения как второй.
Реплики могут выполняться следующими инструментами: RMI, JGroups, JMS, Cache Server(это вроде чисто ехкешовая штука).

Основные классы:

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

Вот методы получения менеджера:
CacheManager.newInstance(Configuration configuration)  создает новую инстанцию менеджера или возвращает, если уже существует с именем указанным в переданной конфигурации
CacheManager.create() Создает новую инстанцию без имени, или возвращает если уже она была создана до этого. Это тоже самое что и предыдущий метод без атрибута конфигурации.
CacheManager.create(Configuration configuration) строго идентично первому методу.
new CacheManager(Configuration configuration) создает инстанцию или выкидывает ексепшин, если уже есть такой менеджер с указанным в конфигурация имени, или конфигурационный обьект налл.

Ehcache - это интрефейс, который реализуют кеши менеджера. Состоит из имени и атрибутов. Содержит Element-ы. Кеш здесь аналогичен кеш-регионам в других системах кеширования.
Элементы сохраняются в MemotyStore, и если настроено, то в случае переполнения (лимиты указываются в настройках) сбрасывается на DiskStore.

Element - атомарный елемент в кеше. Он состоит из пары ключ-значение и записи доступов. Элементы добавляются в кеш и удаляются оттуда. Они также могут истекать по времени жизни и удаляться из кеша Эхкешем в зависимости от настроек.
В кеше может хранится как объекты реализующие Serializable так несерилируемые Object. Работа с ними буквально идетинтичная, кроме как получения кешируемого  или с помощью getObjectValue, или getKeyValue. Несерилизируемые объекты не могут попадать в DiskStore и реплицироваться, если происходит попытка то не выбрасывается исключение, а выводится в лог уровня DEBUG.



воскресенье, 17 февраля 2013 г.

JDBC RowSet

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

У нас есть два класса RowSet:
Connected:
- JdbcRowSet

Disconnected:
- CachedRowSet
- JoinRowSet
- FilteredRowSet

JDBC Statement & ResulSet


И так, чтобы начать получать данные из  базы или сохранять/изменять их в ней, нам нужно создать выражение, и выполнить его, результатом выполнения выражения является ResultSet.

ResultSet бывают нескольких типов, которые определяют методы работы с ним:
TYPE_FORWARD_ONLY - курсор такого резалтсета может двигаться только вперед, при этом данные в этом резалтсете храняться на момент выполнения выражения, не отображая изменения в базе на поточный момент работы в ним через курсор.
TYPE_SCROLL_INSENSITIVE - такой резалтсет позволяет курсору двигаться в любом направлении и в абсолютные позиции, но при этом в нем хранятся данные на момент выполнения выражения.
TYPE_SCROLL_SENSITIVE - курсор такого сета тоже подвижен в любом направлении, но при этом изменения в базе тут же отображаются в резалтсете.

пятница, 15 февраля 2013 г.

Создание из локальной бранчи удаленную. Добавление и удаление тегов

Поточный локальный бранч запушить в удаленный с указанным именем:
git push -u origin NAME_FOR_REMOTE_BRANCH

Добавить новый тэг и сразу его на удаленку:
git tag -a TAG_NAME
git push --tags
Или чтобы запушить только конкретный тег:
git push origin tag_name

Удалить тэг с удаленки и локально:
git tag -d TAG_NAME
git push origin :refs/tags/TAG_NAME

четверг, 14 февраля 2013 г.

Google Cosure. Вводной экскурс статья

http://anton.shevchuk.name/javascript/google-closure-for-beginners-with-examples/

понедельник, 11 февраля 2013 г.

суббота, 9 февраля 2013 г.

JDBC. Получение подключения

Для JDBC, чтобы получить подключение используется два метода:
- DriverManager. Особенность этого класса в том, что с версии 4.0 он подгружает автоматически все драйвера, которые находятся в класспазе, после первого к нему обращения за конекшином. Конекшин он получает по урл.
- DataSource. Более сложный вариант. Но имеет ряд преимуществ. Чтобы он работал администратор должен задеплоить два вида датасорса в работающую систему. 1-й поставщика МРБД, второй поставщика ЕЕ сервера. Создается первый ДС и привязывается через JNDI в javax.naming.InitialContext, создается второй привязывает к себе первый и себя привязывает через JNDI тоже к javax.naming.InitialContext. Чтобы получить конекшин мы создаем обьект javax.naming.InitialContext и по JNDI второго ДС получаем его инстанцию, и теперь через гедКонекшин получаем конекшин указав юзернейм и пароль.

вторник, 5 февраля 2013 г.

Как распознать не сработавший аутоваеред

Когда случается ексепшин вида:

WARN 02.05.13 11:30:32,729 DisposableBeanAdapter [] [] Invocation of destroy method failed on bean with name 'loyaltyServiceImpl': java.lang.NullPointerException [main]

То скорее всего у бина loyaltyServiceImpl (LoyaltyServiceImpl) есть @Autowired, который не был найден.

суббота, 2 февраля 2013 г.

Полезности класса Collections

Обвертки

Есть несколько классов обверток:
1. Первый позволяет обычные коллекции сделать конкурентными.
2. Второй позволяет эти же коллекции сделать неизменяемыми.
3. Третий метод-фабрика позволяет обвернуть коллекции, и если в момент рантайма в коллекцию попытаются добавить объект другого типа чем ожидает коллекция, будет ексепшин. Collections.checked

Удобства

Collections.nCopies(Integer quantity, Type valueForAll);
Collections.singleton(Type element);// создать коллекцию из одного объекта.
Collections.emptySet();//когда нам нужно использовать некий метод, который ожидает коллекцию в параметры, а на этот параметр не важен, мы используем эти методы 
Collections.emptyList();
Collections.emptyMap();

Arrays.asList(new Type[]{...});// так мы получаем обвертку вокруг массива, изменять массив мы можем как через обертку, так и массив напрямую, обвертка не позволяет добавлять/удалять новые элементы(изменять размер массива), выбрасывая исключения(неподдерживаемая операция)


пятница, 1 февраля 2013 г.

Динамическое распределение памяти

При запуске процесса, его обьекты размещаются динамически (на этапе рантайм) в специально выделенной под эти нужны обвласти в опереративной памяти процесса, под названием куча.
Когда процесс запрашивает опеределенный обьем памяти в случае его наличия ОС выделяет эту память. Каждая процедура процесса должна по итогам своего выполенения освобождать выделенную память, если будут происходить утечки (процедура закончила выполнение, но где-то потеряла место освободжения), стек может переполниться и нарушить работу операционной системы.
Существует также проблема дефрагментации кучи, это когда по общему обьему памяти какбы хватает, но поскольку мы запрашиваем под массив достаточно много памяти, и нигде нет такого последовательного блока байт, мы не можем получить память под наш массив.
В случае сборщика муссора, кроме того, что он отслеживает память, которая потеряла ссылки на нее из всех мест процесса, и освобождет ее, он еще в случае необходимости делает дефрагментацию кучи.
В стандарте позикс Си имеет такие процедуры для работы с памятью:

#include <stdlib.h>
 
void *malloc (size_t size);//выделить столько то байт
void *calloc (size_t nelem, size_t elsize);//выделить столько то элементов по столько то байт
void *realloc(void *ptr, size_t size);/*переопределить выделенную последовательность байт,
если было больше, то лишние байты освбождаются, если стало больше и за старой последовательностью
нет больше места, то эта память копируется в место где есть только последовательных свободных байт
и старое место освобождается*/
void free(void *block);//освободить занятый блок

В C++ методов меньше -- new и delete

Куча

Куча - в науке о страктурах данных типа дерево, это структура данных, самая эффективная реализация абстрактоного типа очередь с приоритетом, Обычно это бинарное дерево, для каждого узла которого выполняется условие ключ(Родительский узел) >= ключ(Дочерний узел) - это будет max-куча (тоесть на вершине будет самый максимальный нод), или же: ключ(Родительский узел) <= ключ(Дочерний узел) - это будет min-куча. Применяется в алогоритме Дейкстры, и сортировки методом пирамиды.

Эту кучу не стоит путать с кучей в динамическом распределении памяти. Хотя эта куча получила свое название именно от кучи из структуры данных, поскольку в ранних реализациях языков програмирования таких как Лисп, динамическая память распределялась именно структорой данныз "куча", отсюда и пошло название для выделенного обьема памяти.