пятница, 26 сентября 2014 г.

Hibernate: Hi/Lo алгоритм генерации идентификаторов

Hibernate: Hi/Lo алгоритм генерации идентификаторов

Hi/Lo алгоритм генерации идентификаторов предполагает следующее: чтобы за каждым идентификатором нового persistent-объекта не бегать в БД (как в случае с, например, sequence-генераторами), можно "резервировать" сразу некоторое количество идентификаторов, и назначать их новым объектам, пока они не закончатся и не придется снова идти в БД за новой партией. 
Резервирование заключается в следующем: идентификатор разбивается на 2 части (например, поразрядно). Первая часть (n старших разрядов) - "hi", берется из БД (например, из последовательности). Вторая же - "lo" (m младших разрядов), последовательно назначается приложением. Размер m настраивается в конфигурации, n же определяется типом данных (short / int / long) и установленным размером m.
Пусть, например, m равен двум десятичным разрядам. Тогда, в начале, приложение запрашивает очередное hi-значение из БД (например, из последовательности), и затем использует его для генерации 100 идентификаторов для новых объектов. Скажем, если полученное значение последовательности равно 17, то диапазон идентификаторов, который сможет использовать приложение для новых объектов, будет равен [1700,1799].
Особенно данная оптимизация эффективна при выполнении пакетных вставок большого числа записей в БД.
PS Правда, генератор seqhilo в Hibernate 4.1 ведет себя немного отличным образом: для приведенного выше пример он генерирует последовательности идентификаторов: [1717, 1816], [1818, 1917] и т.п., т.е. он сначала прибавляет hi-значение к младшим разрядам, и лишь потом начинает инкрементирование. Это приводит к образованию не сплошной последовательности идентификаторов, а hi- и lo-части делятся уже не поразрядно. Возможно, такому поведению есть какое-то объяснение, нужно поискать.

WSO2 ESB 4.5.1: создание Scheduled Message Forwarding Processor через веб-консоль и настройка числа попыток повторной доставки

WSO2 ESB 4.5.1: создание Scheduled Message Forwarding Processor через веб-консоль и настройка числа попыток повторной доставки

При создании Scheduled Message Forwarding Processor через веб-консоль WSO2 ESB есть возможность настройки числа попыток повторной отправки сообщения:


Однако, задаваемое здесь значение не применяется к Message Processor'у, и вот почему. В xml-файл конфигурации прокси-сервиса прописывается следующее:
<parameter name="max.delivery.attempts">2</parameter>
Тогда как в документации (https://docs.wso2.com/display/ESB451/Message+Forwarding+Processor) указано имя параметра "max.deliver.attempts". Если поправить имя на указанное в документации, настройка применяется.

GUI-браузер для JKS-файлов

GUI-браузер для JKS-файлов

http://www.clearfield.com/key_store_browser/key_store_browser.html - вполне рабочая вещь, единственное что - импорт сертификатов все равно пришлось делать через keytool, т.к. эта утилита выдавала какую-то невнятную ошибку.

JNDI-браузер

JNDI-браузер

Если нужно посмотреть, что лежит в JNDI, можно воспользоваться утилитой "JNDI Warrior" (распространяется по Apache License 2.0): http://sourceforge.net/projects/jndi-warrior/?source=dlp.

Oracle + Weblogic connection pool: задание схемы по-умолчанию

Oracle + Weblogic connection pool: задание схемы по-умолчанию

Недавно писал про организацию пула соединения с БД в приложении, развертываемом на Weblogic (http://barbitoff.blogspot.ru/2013/07/weblogic-1035-connection-pooling.html). Xml-конфигурация пула позволяет задать все параметры соединения, кроме имени используемой схемы. Хардкодить имя схемы в SQL-запросах не хочется, как и изобретать велосипед с подтягиванием имени схемы из какого-то своего отдельного конфига. Выход - использовать в SQL схему по-умолчанию (т.е. не задавать имя схемы вообще) и воспользоваться таким параметром пула, как "init-sql". В этом параметре нужно указать SQL-запрос, который при инициализации соединения с БД поменяет схему по-умолчанию на необходимую нам. Этот SQL зависит от используемой СУБД, для Oracle он выглядит так:
  <jdbc-connection-pool-params>
    <max-capacity>20</max-capacity>
    <connection-reserve-timeout-seconds>25</connection-reserve-timeout-seconds>
    <test-table-name>SQL SELECT 1 FROM DUAL</test-table-name>
    <init-sql>SQL ALTER SESSION SET CURRENT_SCHEMA = USR</init-sql>  </jdbc-connection-pool-params>

Weblogic 10.3.5: connection pooling в веб-приложении

Weblogic 10.3.5: connection pooling в веб-приложении

Когда-то давно писал об организации connection pool'а в веб-приложении, разворачиваемом на Tomcat 6, на этот же раз возникла необходимость в аналогичном решении для Weblogic 10.3.5.
Ниже описан случай, когда WAR-ник деплоится в составе EAR-ника.
Во-первых, необходимо создать в EAR-нике xml-файл с конфигурацией пула. Поместить его в принципе можно где угодно, я разместил в META-INF/datasources/ и назвал mydb-jdbc.xml. Содержимое у него примерно следующее (на примере Oracle):
<jdbc-data-source xsi:schemaLocation="http://www.bea.com/ns/weblogic/90/domain.xsd"
 xmlns="http://xmlns.oracle.com/weblogic/jdbc-data-source"
 xmlns:sec="http://www.bea.com/ns/weblogic/90/security"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:wls="http://www.bea.com/ns/weblogic/90/security/wls">
  <name>mydb-datasource</name>
  <jdbc-driver-params>
    <url>jdbc:oracle:thin:@//db_host:db_port/db_servicename</url>
    <driver-name>oracle.jdbc.OracleDriver</driver-name>
    <properties>
      <property>
        <name>user</name>
        <value>*****</value>
      </property>
      <property>
        <name>password</name>
        <value>*****</value>
      </property>
    </properties>
  </jdbc-driver-params>
  <jdbc-connection-pool-params>
    <max-capacity>20</max-capacity>
    <connection-reserve-timeout-seconds>25</connection-reserve-timeout-seconds>
    <test-table-name>SQL SELECT 1 FROM DUAL</test-table-name>
  </jdbc-connection-pool-params>
</jdbc-data-source>
Тут в целом все достаточно очевидно. 
После создания данного файла нужно добавить ссылку на него в дескриптор приложения (META-INF/weblogic-application.xml в EAR-нике):
<?xml version="1.0" encoding="UTF-8"?>
<weblogic-application xmlns="http://xmlns.oracle.com/weblogic/weblogic-application" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/javaee_5.xsd http://xmlns.oracle.com/weblogic/weblogic-application http://xmlns.oracle.com/weblogic/weblogic-application/1.0/weblogic-application.xsd">
  <module>
    <name>mydb-datasource-module</name>
    <type>JDBC</type>
    <path>META-INF/datasources/mydb-jdbc.xml</path>
  </module>
</weblogic-application>
Теперь осталось лишь в web.xml WAR-ника, входящего в EAR, добавить ссылку на соотв. ресурс:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <!-... -->
  <resource-ref>
    <res-ref-name>mydb-datasource</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
  </resource-ref>
</web-app>
Все, теперь в коде WAR-ника коннекты к БД получаются так:
    InitialContext ctx = new InitialContext();
    javax.sql.DataSource ds =
            (javax.sql.DataSource) ctx.lookup("java:comp/env/mydb-datasource");
    conn = ds.getConnection();

WSO2 ESB: передача параметра из synapse-окружения в xslt

WSO2 ESB: передача параметра из synapse-окружения в xslt

Задача

Есть некий xslt, выполняемый посредством xslt-медиатора. Есть некое свойство в default synapse-scope, хочется им воспользоваться внутри xslt.

Решение

Просто вызвать xpath-функцию syn:get-property изнутри xstl не получится - получим ругань на то, что функция отсутствует. Но есть другой вариант - через xslt-параметры. В xslt объявляем параметр:
<xsl:stylesheet ...>
<xsl:param name="MyParam" />
<!-- ... -->
</xsl:stylesheet>
А при вызове xslt-медиатора передать нужно значение в этот параметр:
<xslt key="...">
<property name="MyParam" expression="get-property('xxx')"/>
</xslt>

Дамп HTTP-запросов tcpdump-ом

Дамп HTTP-запросов tcpdump-ом

Возникла необходимость посмотреть http-заголовки запросов, приходящих на weblogic. Т.к. вывести произвольный заголовок в access-log без написания кода невозможно (http://technotoddle.blogspot.ru/2010/07/logging-more-information-in-http-logs.html), я решил особо не заморачиваться и посмотреть траффик сниффером. На Win обычно использую для подобных целей Wireshark, но здесь я был на linux-сервере без иксов, поэтому первый раз в жизни воспользовался tcpdump-ом. Делается это так:
tcpdump -A -s 0 'tcp dst port 8080 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'
(здесь сниффятся входящие запросы на порт 8080, если убрать dst, то получим в дампе и запросы, и ответы)
На выходе получил то, что хотел:
17:17:25.769127 IP xxx >yyy: . 297430808:297432068(1260) ack 1587021758 win 16695
E.....@.....
..I
..5.d....o.^...P.A7....GET /da/component/main?__dmfClientId=1409209083173&__dmfRequestId=__client1~~2&__dmfJumpType=jump&__dmfTzoff=-240 HTTP/1.1
Accept: */*
Accept-Language: en-US
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727)
Accept-Encoding: gzip, deflate
Host: 10.2.5.53:8080
Connection: Keep-Alive
Cookie: appname=da;  ...
Спасибо https://sites.google.com/site/jimmyxu101/testing/use-tcpdump-to-monitor-http-traffic

Как я сдавал 1Z0-897 "Oracle Certified Expert, Java EE 6 Web Services Developer"

Как я сдавал 1Z0-897 "Oracle Certified Expert, Java EE 6 Web Services Developer"

Сразу оговорюсь, сдал я не особо - 68% при проходном 64%. Сказалась, как обычно, нехватка времени на подготовку, да еще и отсутствие в свободном доступе внятной информации о том, что конкретно будет на экзамене, а также более ли менее близких к составу экзаменационных вопросов книг и mock-экзаменов.
Собственно на подготовку ушла ровно неделя, точнее целиком я готовился только 2 выходных дня, а в остальные 5 дней в среднем по 3-4 часа. Опыт в разработке SOAP веб-сервисов у меня около 2 лет, но на момент начала подготовки я не мог похвастаться особо глубокими знаниями JAX-WS, т.к. разрабатываемые мной веб-сервисы в основном были достаточно тривиальными, и я довольствовался "обязательным минимумом" знаний. Что такое XML Schema и WSDL я знал, но в последнем также не был большим знатоком. REST же для меня был вообще практически новым словом, что это такое, я конечно представлял, но на практике никогда применять не приходилось. Собственно это все и стало предпосылкой к сдаче экзамена, т.к. экзамен - отличный повод "прибраться" в своих знаниях, систематизировать их, а также узнать что-то новое, что потом можно использовать на практике.
При подготовке я в основном ориентировался на содержимое вот этой странички на код-ранче: http://www.coderanch.com/how-to/java/ScdjwsLinks, поэтому первое, с чего я начал подготовку - прочитал книжку "Java Web Services: Up and Running" под авторством Martin Kalin (2009). Книжка по объему достаточно скромная - всего 318 страниц (+ некоторые разделы, например про историю веб-сервисов, можно смело пропускать), поэтому осилить ее можно достаточно быстро. По ходу чтения делал заметки, чтобы перед экзаменом была возможность быстро освежить в памяти полученные из нее знания. Из книги узнал для себя много нового, многие вещи, казавшиеся раньше загадочными, теперь стали очевидными. Не могу сказать, что книга дает исчерпывающие значения по теме, но она определенно показывает, в какую сторону копать при наличии той или иной задачи. Сказать, что этой книги достаточно для успешной сдачи экзамена, тоже с полной уверенностью нельзя. Но об этом немного позже.
После прочтения книги у меня закрались сомнения в том, что полученных знаний хватит для получения сертификата, и я начал судорожно искать, где бы еще что-нибудь почитать по теме. Для начала просмотрел вот этот гайд: http://java.boot.by/ocewsd6-guide/, - там многое пересекается с книгой (даже возникает впечатление, что оно оттуда и скопировано), но в тоже время есть и новая информация, в частности, по REST и JAX-RS. Чтобы окончательно удостовериться в том, что полученные мной знания по REST и JAX-RS достаточно полны, я также прочитал статью на сайте IBM: http://www.ibm.com/developerworks/ru/library/wa-jaxrs/.
В довершение, уже вечером перед экзамен, я пробежался по тестам тут:  http://www.examclouds.com/ (в разделе "WS Quiz"). Тесты меня несколько испугали, т.к. ответы на многие вопросы я не знал. Но как оказалось, это и не нужно - на экзамене ничего подобного не было.
Собственно вот и вся подготовка. Выспаться перед экзаменом не получилось, но свежесваренный кофе сделал свое дело =)
Сдавал я в Unix Education Center, там же, где 10 месяцами ранее я экзаменовался на OCJP. На экзамен дается 1.5 часа, вопросов в тесте - 60. В общем-то, расслабляться нельзя, времени не много. Я успел ответить на все вопросы за 1:15, потом просмотрел еще раз те вопросы, по которым были сомнения. Была пара вопросов, отображавшихся некорректно из-за того видимо, что xml, входящий в текст вопроса, забыли экранировать, и он попросту не показывался. Написал жалобу в pearsonvue, через которых заказывал экзамен, обещали разобраться.
Теперь про вопросы на экзамене. Их уровень не запредельный, обойтись одной только книжкой "Java Web Services: Up and Running" было бы сложно, но в целом, запомни я все прочитанное получше, сдать можно было бы на более высокий балл. Единственная тема, к которой я был совершенно не готов (а на которую, однако, было не менее 4-5 вопросов) - это WS-I.

Как задеплоить варник на jboss


Как задеплоить варник на jboss
atott
Привет. А сейчас я скажу как задеплоить варник на jboss. Если кто-то подумал, что на tomcat трудно деплоить, то этот кто-то лоханулся.

Первым делом подготовим почву для деплоя. Создадим варник. Причем в принципе он ничем отличаться не будет от того, который мы деплоили в статье Как задеплоить варник на tomcat.  За исключением одного НО. Нужно создать еще один web.xml специально для jboss.

Создаем jboss-web.xml и кладем его туда где уже валяется web.xml. Кстати - ничего удалять из него (web.xml) не нужно, а то знаю я вас, удалите все что только можно.

<?xml version="1.0" encoding="UTF-8"?>
<jboss-web>  
    <resource-ref>
        <description>Online Marketplace Oracle datasource.</description>
        <res-ref-name>jdbc/marketplace</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <jndi-name>java:jdbc/marketplace</jndi-name>
      </resource-ref>
</jboss-web>

Теперь самое интересное. Нужно настроить jndi ресурс на босе. Заходим в  папку d:\jboss-4.2.3.GA\server\default\deploy\ и создаем файл oracle-ds.xml

<?xml version="1.0" encoding="UTF-8"?>
<datasources>
  <local-tx-datasource>
    <jndi-name>jdbc/marketplace</jndi-name>
    <connection-url>jdbc:oracle:thin:<comp_name>:1521/XE</connection-url>
    <driver-class>oracle.jdbc.OracleDriver</driver-class>
    <user-name>userName</user-name>
    <password>password</password>
    <valid-connection-checker-classname>
      org.jboss.resource.adapter.jdbc.vendor.OracleValidConnectionChecker
    </valid-connection-checker-classname>
    <metadata>
      <type-mapping>Oracle9i</type-mapping>
    </metadata>
  </local-tx-datasource>
</datasources>


Теперь все работает и для того чтобы все заработало достаточно собрать варник и скопировать его в папку d:\jboss-4.2.3.GA\server\default\deploy\. Перезаупскаем сервер и смотрим на наше приложение.

Вроде бы просто, но с первого раза точно не получится). Да, чуть не забыл и не забываем копировать дрова от oracle в попку lib.
Tags: