пятница, 19 июля 2013 г.

Конструкция select for update

Есть такие примечательные sql-конструкции:
  • oracle: select ... from table where ... for update
  • ms sql server: select ... from table with (updlock, rowlock) where ...
Смысл и результат выполнения обеих весьма схож: выбрать из таблицы записи для обработки, удовлетворяющие определённым условиям, и установить на выбранные записи блокировку, чтобы предотвратить их чтение/изменение другими пользователями до окончания обработки.
Вероятно, отличия между ними есть. Однако, после столкновения "здесь и сейчас" именно с oracle-вариантом, дальнейшее описание будет посвящено этой конструкции - select for update.

вторник, 16 июля 2013 г.

Быстрая набивка тестовой таблицы в oracle

Мелкая заметка. Иногда надо быстренько заполнить данными какую-нибудь тестовую табличку в базе данных; в последний раз таковой оказалась rdbms oracle, а потому весь процесс для неё решил зафиксировать на будущее.

понедельник, 15 июля 2013 г.

Загрузка классов jdk на jboss as 7

jboss 7 "из коробки" не видит некоторые пакеты jdk

В прикладном коде приложения используются классы из пакета com.sun.net.httpserver - обычные классы jdk из rt.jar. На сервере приложений jboss 7 попытка запуститься привела к ошибке:
StandardWrapper.Throwable: java.lang.NoClassDefFoundError: com/sun/net/httpserver/HttpHandler
jvm 1    |     at java.lang.Class.getDeclaredConstructors0(Native Method) [rt.jar:1.7.0]
jvm 1    |     at java.lang.Class.privateGetDeclaredConstructors(Class.java:2404) [rt.jar:1.7.0]
...
jvm 1    | Caused by: java.lang.ClassNotFoundException: com.sun.net.httpserver.HttpHandler from [Module "deployment.easygeo-1.0-SNAPSHOT.ear.front-1.0-SNAPSHOT.war:main" from Service Module Loader]
jvm 1    |     at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:190)
jvm 1    |     at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:468)
jvm 1    |     at org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:456)
jvm 1    |     at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:398)
jvm 1    |     at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:120)
jvm 1    |     ... 32 more
Казалось бы, jboss запускается же ведь на указанной jdk (запуск выполняется с помощью wrapper.tanukisoftware.com, и во wrapper.conf установлено верное значение JAVA_HOME; да и вообще - всё остальное же работает!). Почему сервер не видит стандартный пакет?
Решение оказалось простым. Файл jboss_home\modules\sun\jdk\main\module.xml содержит перечней тех пакетов jdk, которые деплоятся. Выглядит так:
<module xmlns="urn:jboss:module:1.1" name="sun.jdk">
...
    <dependencies>
        <system-export="true">
            <paths>
                <path name="com/sun/script/javascript"/>
                <path name="com/sun/indi/..."/>
                <path name="com/sun/security/..."/>
                <path name="sun/io"/>
                <path name="sun/util"/>
... и т. д.
Дописал там:
<path name="com/sun/net/httpserver" />
и всё чудесным образом стало хорошо! Аналогично можно подключить и пакеты из resources.jar.
P. S. Хотя это выглядит несколько странным, когда требуется править внутренние конфиги сервера приложений. Возможно, есть более красивое решение?