mirror of
https://gitee.com/jmix/cuba.git
synced 2024-12-04 20:28:00 +08:00
Refs #1633 CUBA documentation (dbms)
This commit is contained in:
parent
c68f47ed5d
commit
0da579c5f6
@ -19,6 +19,14 @@
|
||||
<title>Конфигурационный каталог</title>
|
||||
<para>TODO</para>
|
||||
</section>
|
||||
<section id="work_dir">
|
||||
<title>Рабочий каталог</title>
|
||||
<para>TODO</para>
|
||||
</section>
|
||||
<section id="db_dir">
|
||||
<title>Каталог скриптов базы данных</title>
|
||||
<para>TODO</para>
|
||||
</section>
|
||||
</section>
|
||||
<section>
|
||||
<title>Варианты запуска Tomcat</title>
|
||||
@ -29,139 +37,11 @@
|
||||
<para>TODO</para>
|
||||
</section>
|
||||
<section>
|
||||
<title>Интеграция с Active Directory</title>
|
||||
<para>TODO</para>
|
||||
</section>
|
||||
<section>
|
||||
<title>Организация кластера</title>
|
||||
<title>Отказоустойчивость и балансировка нагрузки</title>
|
||||
<para>TODO</para>
|
||||
</section>
|
||||
<section>
|
||||
<title>Мониторинг работы приложения</title>
|
||||
<para>TODO</para>
|
||||
</section>
|
||||
<section>
|
||||
<title>Резервное копирование базы данных</title>
|
||||
<para>Для резервного копирования базы данных и приложения необходимо:</para>
|
||||
<orderedlist>
|
||||
<listitem>
|
||||
<para>Создать каталог для резервного копирования</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>Создать скрипт в созданном каталоге</para>
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para>Для <application>Windows</application> − <filename>backup.bat</filename></para>
|
||||
<programlisting><xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="source/section_development/applicationBackup/backup.bat" encoding="UTF-8" parse="text"/></programlisting>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>Для <application>Linux</application> − <filename>backup.sh</filename></para>
|
||||
<programlisting><xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="source/section_development/applicationBackup/backup.sh" encoding="UTF-8" parse="text"/></programlisting>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>Настроить параметры в скрипте (см. таблицу ниже) в соответствии с Вашей системой</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>Создать файл с паролем</para>
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para>Для <application>Windows</application> в файле <filename>%APPDATA%\postgresql\pgpass.conf </filename>(<filename>%APPDATA%</filename> − это Application Data пользователя <application>Windows</application>, под которым будет выполняться копирование) должна быть запись вида <parameter>host:port:databasename:user:password</parameter> (например, <parameter>localhost:5432:docflow:root:root</parameter>)</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>Для <application>Linux</application> нужно создать файл <filename>.pgpass</filename> в домашней директории пользователя, под которым будет выполняться копирование (например <filename>/root</filename>) c содержимым, описанным выше, и запретить просмотр и редактирование другим пользователям командой <prompt>chmod 600 .pgpass</prompt></para>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>Сделать скрипт автоисполняемым в зависимости от системы</para>
|
||||
</listitem>
|
||||
</orderedlist>
|
||||
<informaltable frame="all" pgwide="0" align="center">
|
||||
<tgroup cols="3" colsep="1" rowsep="1" align="center">
|
||||
<colspec colname="c1"/>
|
||||
<colspec colname="c2"/>
|
||||
<colspec colname="c3"/>
|
||||
<thead wordsize="16">
|
||||
<row>
|
||||
<entry colname="Имя атрибута" role="bord">Параметр</entry>
|
||||
<entry colname="Тип атрибута" role="caption">Описание</entry>
|
||||
<entry colname="Тип атрибута" role="caption">Значение</entry>
|
||||
</row>
|
||||
</thead>
|
||||
<tbody>
|
||||
<row>
|
||||
<entry align="center" role="left">PG_DIR</entry>
|
||||
<entry role="special">Путь к папке <filename>bin</filename>, где установлен <application>PostgreSQL</application></entry>
|
||||
<entry role="right"><filename>C:\Program Files\PostgreSQL\8.3\bin</filename> (пример)</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry align="left">TOMCAT_DIR</entry>
|
||||
<entry align="left">Каталог приложения</entry>
|
||||
<entry align="left"><filename>D:\work\thesis2\tomcat</filename> (пример)</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry align="left" role="left">BACKUP_DIR</entry>
|
||||
<entry align="left" role="special">Каталог для резервного копирования, который был создан в п.1</entry>
|
||||
<entry align="left" role="right"><filename>D:\backup</filename> (пример)</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry align="left">PG_HOST</entry>
|
||||
<entry align="left">IP адрес подключения к копируемой базе данных</entry>
|
||||
<entry align="left">localhost (по умолчанию)</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry align="left" role="left">PG_PORT</entry>
|
||||
<entry align="left" role="special">Порт подключения к копируемой базе данных</entry>
|
||||
<entry align="left" role="right">5432 (по умолчанию)</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry align="center">DB_NAME</entry>
|
||||
<entry>Имя копируемой базы данных</entry>
|
||||
<entry>docflow (пример)</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry align="left" role="left">PG_USER</entry>
|
||||
<entry align="left" role="special">Пользователь базы данных, под которым выполняется копирование</entry>
|
||||
<entry align="left" role="right">root (по умолчанию)</entry>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
</informaltable>
|
||||
<para>В результате резервного копирования каталог, созданный в п.1, будет иметь следующий вид:</para>
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para><filename>backup</filename></para>
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para><filename>2010_09_22</filename> − каталог, созданный скриптом</para>
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para><filename>tomcat</filename> − копия приложения</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para><filename>docflow_2010_09_22.dump</filename> − копия базы данных</para>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>...</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para><filename>2010_09_28</filename></para>
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para><filename>tomcat</filename></para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para><filename>docflow_2010_10_28.dump</filename></para>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
<para>При повторном выполнении скрипта будет создана новая копия базы данных, а в копии приложения будут обновлены файлы.</para>
|
||||
</section>
|
||||
</chapter>
|
||||
|
@ -2777,6 +2777,21 @@ public class Orders implements OrdersMBean {
|
||||
<para>Следует иметь в виду, что измененные значения для свойств, хранящихся в файлах, не сохраняются, и действуют только до рестарта данного блока.</para>
|
||||
<para>JMX ObjectName: <literal>app-core.cuba:type=ConfigStorage</literal>, <literal>app.cuba:type=ConfigStorage</literal>, <literal>app-portal.cuba:type=ConfigStorage</literal></para>
|
||||
</section>
|
||||
<section id="persistenceManagerMBean">
|
||||
<title>PersistenceManagerMBean</title>
|
||||
<para><code>PersistenceManagerMBean</code> предоставляет следующие возможности:<itemizedlist>
|
||||
<listitem>
|
||||
<para>управление механизмом <link linkend="entity_statistics">статистики сущностей</link></para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>отображение новых скриптов обновления БД методом <code>findUpdateDatabaseScripts()</code> и запуск обновления методом <code>updateDatabase()</code></para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>запуск произвольных JPQL запросов в контексте <structname>Middleware</structname> методами <code>jpqlLoadList()</code>, <code>jpqlExecuteUpdate()</code></para>
|
||||
</listitem>
|
||||
</itemizedlist></para>
|
||||
<para>JMX ObjectName: <literal>app-core.cuba:type=PersistenceManager</literal></para>
|
||||
</section>
|
||||
<section id="scriptingManagerMBean">
|
||||
<title>ScriptingManagerMBean</title>
|
||||
<para><code>ScriptingManagerMBean</code> является JMX-фасадом для интерфейса инфраструктуры <code>
|
||||
@ -2790,7 +2805,7 @@ public class Orders implements OrdersMBean {
|
||||
</itemizedlist></para>
|
||||
<para>JMX операции:<itemizedlist>
|
||||
<listitem>
|
||||
<para><code>runGroovyScript()</code> - выполнить скрипт Groovy и вернуть результат. Для отображения в JMX-интерфейсе результат должен быть типа <code>String</code>. В остальном аналогичен методу <code>Scripting.<link linkend="scripting.runGroovyScript">runGroovyScript()</link></code>. </para>
|
||||
<para><code>runGroovyScript()</code> - выполнить скрипт Groovy в контексте <structname>Middleware</structname> и вернуть результат. Для отображения в JMX-интерфейсе результат должен быть типа <code>String</code>. В остальном аналогичен методу <code>Scripting.<link linkend="scripting.runGroovyScript">runGroovyScript()</link></code>. </para>
|
||||
</listitem>
|
||||
</itemizedlist></para>
|
||||
</section>
|
||||
@ -2983,6 +2998,11 @@ query.setParameter(1, customer);</programlisting></para>
|
||||
<para><code>getDelegate()</code> - возвращает экземпляр <code>javax.persistence.Query</code>, предоставляемый реализацией ORM.</para>
|
||||
</listitem>
|
||||
</itemizedlist></para>
|
||||
<section>
|
||||
<title>Поиск like без учета регистра</title>
|
||||
<para>Для удобного формирования условия поиска без учета регистра символов и по любой части строки можно использовать префикс <literal>(?i)</literal> имени параметра запроса, например:<programlisting>select c from sales$Customer c where c.name like :(?i)name</programlisting></para>
|
||||
<para>В данном случае ORM переведет значение параметра <literal>name</literal> в нижний регистр и обрамит символами <literal>%</literal>, а затем в БД выполнит SQL с условием вида <literal> lower(C.NAME) like ?</literal></para>
|
||||
</section>
|
||||
<section>
|
||||
<title>Макросы в JPQL</title>
|
||||
<para>Текст JPQL запроса может включать макросы, которые обрабатываются перед выполнением и превращаются в исполняемый JPQL, дополнительно модифицируя набор параметров.</para>
|
||||
@ -3312,46 +3332,202 @@ public void someServiceMethod() {
|
||||
</itemizedlist></para>
|
||||
<para>Таблицу <database>SYS_QUERY_RESULT</database> необходимо периодически чистить от ненужных результатов запросов, оставленных завершенными пользовательскими сессиями. Для этого предназначен метод <code>deleteForInactiveSessions</code> бина <code>QueryResultsManagerAPI</code>. В прикладном проекте с включенным параметром <property>
|
||||
<link linkend="cuba.allowQueryFromSelected">cuba.allowQueryFromSelected</link>
|
||||
</property> необходимо вызывать этот метод либо из <link linkend="scheduled_tasks">назначенных заданий</link>, либо из стандартного планировщика <application>Spring</application>, например:<programlisting><task:scheduled-tasks scheduler="scheduler">
|
||||
<task:scheduled ref="cuba_QueryResultsManager" method="deleteForInactiveSessions" fixed-rate="600000"/>
|
||||
</property> необходимо вызывать этот метод либо из <link linkend="scheduled_tasks">назначенных заданий</link>, либо из стандартного планировщика <application>Spring</application>, например:<programlisting><task:scheduled-tasks scheduler="scheduler">
|
||||
<task:scheduled ref="cuba_QueryResultsManager" method="deleteForInactiveSessions" fixed-rate="600000"/>
|
||||
</task:scheduled-tasks></programlisting></para>
|
||||
</section>
|
||||
</section>
|
||||
<section id="dbms_types">
|
||||
<title>Поддерживаемые СУБД</title>
|
||||
<para>Тип используемой СУБД определяется <glossterm linkend="app_properties_glossentry">параметром</glossterm> среднего слоя <parameter>cuba.dbmsType</parameter> и настройкой источника данных в <application>Tomcat</application>.</para>
|
||||
<variablelist>
|
||||
<varlistentry>
|
||||
<term>PostgreSQL</term>
|
||||
<listitem>
|
||||
<para>Поддерживается всеми проектами платформы: CUBA, Workflow, FTS, Charts, CCPayments, RefApp.</para>
|
||||
<para><emphasis role="bold">Настройка</emphasis></para>
|
||||
<para>Параметр среднего слоя:</para>
|
||||
<programlisting><xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="source/cuba_dbmstype_postgres.txt" encoding="UTF-8" parse="text"/></programlisting>
|
||||
<para>Источник данных в context.xml:</para>
|
||||
<programlisting language="xml"><xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="source/context_postgres.xml" encoding="UTF-8" parse="text"/></programlisting>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>Microsoft SQL Server</term>
|
||||
<listitem>
|
||||
<para>Поддерживается проектами: CUBA, Workflow, FTS, RefApp.</para>
|
||||
<para><emphasis role="bold">Настройка</emphasis></para>
|
||||
<para>Параметр среднего слоя:</para>
|
||||
<programlisting><xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="source/cuba_dbmstype_mssql.txt" encoding="UTF-8" parse="text"/></programlisting>
|
||||
<para>Источник данных в context.xml:</para>
|
||||
<programlisting><xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="source/context_mssql.xml" encoding="UTF-8" parse="text"/></programlisting>
|
||||
<para>В настройках MS SQL надо включить возможность логина для пользователя sa и задать для него пароль из context.xml. Это можно сделать из MS SQL Management Studio, в окне Object Explorer.
|
||||
<title>Работа с СУБД</title>
|
||||
<section>
|
||||
<title>Выбор и подключение</title>
|
||||
<para>Тип используемой СУБД определяется свойством приложения <property>
|
||||
<link linkend="cuba.dbmsType">cuba.dbmsType</link>
|
||||
</property> и настройкой источника данных. Конфигурационный файл для Tomcat, определяющий источник данных, описан в <xref linkend="context.xml"/></para>
|
||||
<warning>
|
||||
<para>Обратите внимание на применимость СУБД в зависимости от используемых <link linkend="base_projects">базовых проектов</link> платформы:<itemizedlist>
|
||||
<listitem>
|
||||
<para><application>HSQLDB</application> - применяется только для запуска интеграционных тестов платформы, не используется в прикладных проектах</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para><application>PostgreSQL</application> - поддерживается всеми базовыми проектами платформы</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para><application>Microsoft SQL Server</application> - поддерживается базовыми проектами <structname>cuba</structname>, <structname>workflow</structname>, <structname>fts</structname></para>
|
||||
</listitem>
|
||||
</itemizedlist></para>
|
||||
</warning>
|
||||
</section>
|
||||
<section id="db_scripts">
|
||||
<title>Создание и обновление БД</title>
|
||||
<para>Проект CUBA-приложения всегда содержит два набора SQL скриптов:<itemizedlist>
|
||||
<listitem>
|
||||
<para>Скрипты создания БД - предназначены для создания базы данных с нуля.</para>
|
||||
<para>Скрипты создания располагаются в каталоге <filename>/db/init</filename> модуля <structname>core</structname>. Для каждого типа СУБД, поддерживаемой приложением, создается свой набор скриптов и располагается в подкаталоге с именем, соответствующим значению перечисления <code>DbmsType</code>, например <filename>/db/init/postgres</filename>. Имена скриптов создания должны иметь вид <filename>{optional_prefix}create-db.sql</filename>.</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>Скрипты обновления БД - предназначены для поэтапного приведения структуры БД к текущему состоянию <link linkend="data_model">модели данных</link>.</para>
|
||||
<para>Скрипты обновления располагаются в каталоге <filename>/db/update</filename> модуля <structname>core</structname>. Для каждого типа СУБД, поддерживаемой приложением, создается свой набор скриптов и располагается в подкаталоге с именем, соответствующим значению перечисления <code>DbmsType</code>, например <filename>/db/update/postgres</filename>. </para>
|
||||
<para>Скрипты обновления должны иметь имена, которые при сортировке в алфавитном порядке образуют правильную последовательность их выполнения (обычно это хронологическая последовательность их создания). Поэтому рекомендуется задавать имя скрипта обновления в виде <filename>{yymmdd}-{description}.sql</filename>, где <literal>yy</literal> - год, <literal>mm</literal> - месяц, <literal>dd</literal> - день, <literal>description</literal> - краткое описание скрипта. Например <filename>121003-addCodeToCategoryAttribute.sql</filename>.</para>
|
||||
<para>Скрипты обновления можно группировать в подкаталоги, главное чтобы путь к скрипту с учетом подкаталога не нарушал хронологической последовательности. Например, можно создавать подкаталоги по номеру года или по году и месяцу.</para>
|
||||
</listitem>
|
||||
</itemizedlist></para>
|
||||
<para>В развернутом приложении скрипты создания и обновления БД располагаются в специальном <link linkend="db_dir">каталоге скриптов базы данных</link>, задаваемым свойством приложения <property>
|
||||
<link linkend="cuba.dbDir">cuba.dbDir</link>
|
||||
</property>.</para>
|
||||
<para>Скрипты представляют собой текстовые файлы с набором DDL и DML команд, разделенных символом "<literal>^</literal>". Символ "<literal>^</literal>" применяется для того, чтобы можно было применять разделитель "<literal>;</literal>" в составе сложных команд, например при создании функций или триггеров. Встроенный механизм исполнения скриптов разделяет входной файл на команды по разделителю "<literal>^</literal>" и выполняет каждую команду в отдельной транзакции. Это означает, что при необходимости можно сгруппировать несколько простых операторов (например <literal>insert</literal>), разделенных точкой с запятой, и обеспечить выполнение их в одной транзакции.</para>
|
||||
<section>
|
||||
<title>Создание БД</title>
|
||||
<para>Базу данных можно создать двумя способами: с помощью скрипта сборки Gradle или на старте приложения путем запуска автоматического обновления.</para>
|
||||
<para>Скрипт сборки <filename>build.gradle</filename> содержит задачу <code>createDb</code>, которая создает указанную в параметрах задачи БД и выполняет на ней все SQL скрипты создания (базовых проектов и самого приложения). </para>
|
||||
<warning>
|
||||
<para>Если база данных по указанному в скрипте сборки URL существует, она полностью удаляется и создается заново.</para>
|
||||
</warning>
|
||||
<para>Чтобы инициализировать БД <link linkend="db_update">механизмом автоматического обновления</link> (например в развернутом приложении при отсутствии скрипта сборки), нужно выполнить следующее:<itemizedlist>
|
||||
<listitem>
|
||||
<para>включить свойство приложения <property>
|
||||
<link linkend="cuba.automaticDatabaseUpdate">cuba.automaticDatabaseUpdate</link>
|
||||
</property></para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>создать пустую базу данных, соответствующую URL, заданному в описании источника данных в <filename>
|
||||
<link linkend="context.xml">context.xml</link>
|
||||
</filename></para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>запустить веб-сервер, содержащий блок <structname>Middleware</structname>. На старте приложения БД будет проинициализирована и сразу же готова к работе.</para>
|
||||
</listitem>
|
||||
</itemizedlist></para>
|
||||
</section>
|
||||
<section>
|
||||
<title>Обновление БД</title>
|
||||
<para>Процесс обновления базы данных заключается в выполнении скриптов обновления, присутствующих в проекте или в каталоге скриптов, которые не зарегистрированы как выполненные в таблице <database>SYS_DB_CHANGELOG</database>. Эти скрипты могут быть выполнены как вручную (используя сторонние инструменты), так и следующими встроенными в систему способами:<itemizedlist>
|
||||
<listitem>
|
||||
<para>Выполнением задачи <code>updateDb</code> скрипта сборки <filename>build.gradle</filename>.</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>В работающем приложении:<itemizedlist>
|
||||
<listitem>
|
||||
<para>на старте <structname>Middleware</structname> при включенном <link linkend="db_update">механизме автоматического обновления</link></para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>после старта вызовом метода <code>updateDatabase()</code> JMX-бина <code>
|
||||
<link linkend="persistenceManagerMBean">PersistenceManagerMBean</link>
|
||||
</code></para>
|
||||
</listitem>
|
||||
</itemizedlist></para>
|
||||
</listitem>
|
||||
</itemizedlist></para>
|
||||
</section>
|
||||
<section id="db_update">
|
||||
<title>Механизм автоматического обновления</title>
|
||||
<para>Механизм автоматического обновления включается свойством приложения <property>
|
||||
<link linkend="cuba.automaticDatabaseUpdate">cuba.automaticDatabaseUpdate</link>
|
||||
</property>. Он активируется на старте блока <structname>Middleware</structname> до момента полной инициализации приложения, и действует следующим образом:<itemizedlist>
|
||||
<listitem>
|
||||
<para>Если в БД отсутствует таблица <database>SEC_USER</database>, то считается, что база данных пуста, и запускается полная инициализация с помощью скриптов создания БД. После выполнения инициализирующих скриптов их имена запоминаются в таблице <database>SYS_DB_CHANGELOG</database>. Кроме того, там же сохраняются имена всех доступных скриптов обновления, <emphasis>без их выполнения</emphasis>.</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>Если в БД имеется таблица <database>SEC_USER</database>, но отсутствует таблица <database>SYS_DB_CHANGELOG</database> (это случай, когда в первый раз запускается описываемый механизм на имеющейся рабочей БД), никакие скрипты <emphasis>не запускаются</emphasis>. Вместо этого создается таблица <database>SYS_DB_CHANGELOG</database> и в ней сохраняются имена всех доступных на данный момент скриптов обновления. </para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>Если в БД имеются и таблица <database>SEC_USER</database> и таблица <database>SYS_DB_CHANGELOG</database>, производится запуск скриптов обновления, и их имена запоминаются в таблице <database>SYS_DB_CHANGELOG</database>. Причем запускаются только те скрипты, имен которых не было в таблице <database>SYS_DB_CHANGELOG</database>, т.е. не запускавшиеся ранее.
|
||||
Последовательность запуска скриптов определяется 2-мя факторами: приоритетом базового проекта (см. содержимое <link linkend="db_dir">каталога скриптов базы данных</link>: <filename>10-cuba</filename>, <filename>20-workflow</filename>, ...) и именем файла скрипта (с учетом подкаталогов внутри каталога <filename>update</filename>) в алфавитном порядке.</para>
|
||||
</listitem>
|
||||
</itemizedlist></para>
|
||||
</section>
|
||||
</section>
|
||||
<section>
|
||||
<title>Проектирование БД</title>
|
||||
<section>
|
||||
<title>Соответствие типов данных</title>
|
||||
<para>В таблице приведено соответствие типов данных, отличающихся для разных СУБД.</para>
|
||||
<informaltable frame="all">
|
||||
<tgroup cols="3">
|
||||
<colspec colnum="1" colname="c0"/>
|
||||
<colspec colnum="2" colname="c1"/>
|
||||
<colspec colnum="3" colname="c2"/>
|
||||
<thead>
|
||||
<row>
|
||||
<entry>Java</entry>
|
||||
<entry>PostgreSQL</entry>
|
||||
<entry>MS SQL Server</entry>
|
||||
</row>
|
||||
</thead>
|
||||
<tbody>
|
||||
<row>
|
||||
<entry>UUID</entry>
|
||||
<entry>uuid</entry>
|
||||
<entry>uniqueidentifier</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>Date</entry>
|
||||
<entry>timestamp</entry>
|
||||
<entry>datetime</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>Boolean</entry>
|
||||
<entry>boolean</entry>
|
||||
<entry>tinyint</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>byte[]</entry>
|
||||
<entry>bytea</entry>
|
||||
<entry>image</entry>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
</informaltable>
|
||||
</section>
|
||||
<section>
|
||||
<title>Особенности MS SQL Server</title>
|
||||
<para><application>Microsoft SQL Server</application> использует кластерные индексы для таблиц.</para>
|
||||
<para>По умолчанию кластерный индекс создается по первичному ключу таблицы, однако используемые в CUBA-приложении ключи типа <code>UUID</code> плохо подходят для кластерного индекса. Поэтому необходимо для каждой таблицы правильно выбрать и создать кластерный индекс. Поле для кластерного индекса должно быть небольшим и монотонно возрастающим, поэтому ориентировочные правила следующие:<itemizedlist>
|
||||
<listitem>
|
||||
<para>Для большинства таблиц подходит поле <database>CREATE_TS</database>. При этом записи будут физически располагаться в порядке их создания. </para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>Для композитных сущностей, если чтение превалирует над записью, имеет смысл использовать ссылку на владельца. При этом записи будут сгруппированы по владельцам, и их извлечение вместе с владельцем будет происходить быстрее. </para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>Для небольших (< 100 записей) редко изменяемых таблиц тип кластерного индекса не важен, можно оставить <database>ID</database>. </para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>Для таблиц сущностей, унаследованных по стратегии <code>JOINED</code>, в которых нет поля <database>CREATE_TS</database>, нужно создать его искусственно с параметром <literal>default current_tmestamp</literal>. </para>
|
||||
</listitem>
|
||||
</itemizedlist></para>
|
||||
<para>Пример:<programlisting>create table SALES_CUSTOMER (
|
||||
ID uniqueidentifier not null,
|
||||
CREATE_TS datetime,
|
||||
...
|
||||
primary key nonclustered (ID)
|
||||
)^
|
||||
|
||||
Instance − ваш SQL Server.</para>
|
||||
<programlisting><xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="source/instance_mssql.txt" encoding="UTF-8" parse="text"/></programlisting>
|
||||
<para>Включить сетевую аутентификацию:</para>
|
||||
<programlisting><xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="source/instance1_mssql.txt" encoding="UTF-8" parse="text"/></programlisting>
|
||||
<para>Разрешить доступ по TCP/IP можно из Sql Server Configuration Manager</para>
|
||||
<programlisting><xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="source/instance2_mssql.txt" encoding="UTF-8" parse="text"/></programlisting>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
</variablelist>
|
||||
create clustered index IDX_SALES_CUSTOMER_CREATE_TS on SALES_CUSTOMER (CREATE_TS)^</programlisting></para>
|
||||
<para>Пример композитной сущности: <programlisting>create table SALES_ITEM (
|
||||
ID uniqueidentifier not null,
|
||||
CREATE_TS datetime,
|
||||
...
|
||||
ORDER_ID uniqueidentifier,
|
||||
...
|
||||
primary key nonclustered (ID),
|
||||
constraint FK_SALES_ITEM_ORDER foreign key (ORDER_ID) references SALES_ORDER(ID)
|
||||
)^
|
||||
|
||||
create clustered index IDX_SALES_ITEM_ORDER on SALES_ITEM (ORDER_ID)^</programlisting></para>
|
||||
<para>Пример унаследованной сущности: <programlisting>create table SALES_DOC (
|
||||
CARD_ID uniqueidentifier,
|
||||
CREATE_TS datetime default current_timestamp,
|
||||
NUMBER varchar(50),
|
||||
primary key nonclustered (CARD_ID),
|
||||
constraint FK_SALES_DOC_CARD foreign key (CARD_ID) references WF_CARD (ID)
|
||||
)^
|
||||
|
||||
create clustered index IDX_SALES_DOC_CREATE_TS on SALES_DOC (CREATE_TS)^
|
||||
|
||||
create index IDX_SALES_DOC_CARD on SALES_DOC (CARD_ID)^</programlisting></para>
|
||||
</section>
|
||||
</section>
|
||||
</section>
|
||||
</section>
|
||||
<section id="client">
|
||||
@ -8191,18 +8367,14 @@ taskHandler.execute();</programlisting>
|
||||
</section>
|
||||
<section>
|
||||
<title>Механизмы платформы</title>
|
||||
<section id="db_update">
|
||||
<title>Обновление базы данных</title>
|
||||
<section id="scheduled_tasks">
|
||||
<title>Выполнение задач по расписанию</title>
|
||||
<para>TODO</para>
|
||||
</section>
|
||||
<section id="email_sending">
|
||||
<title>Отсылка email</title>
|
||||
<para>TODO</para>
|
||||
</section>
|
||||
<section id="scheduled_tasks">
|
||||
<title>Выполнение задач по расписанию</title>
|
||||
<para>TODO</para>
|
||||
</section>
|
||||
<section id="runtime_properties">
|
||||
<title>Динамические атрибуты</title>
|
||||
<para>TODO</para>
|
||||
@ -8211,7 +8383,7 @@ taskHandler.execute();</programlisting>
|
||||
<title>Пессимистичная блокировка</title>
|
||||
<para>TODO</para>
|
||||
</section>
|
||||
<section>
|
||||
<section id="entity_statistics">
|
||||
<title>Статистика сущностей</title>
|
||||
<para>TODO</para>
|
||||
</section>
|
||||
|
@ -111,7 +111,34 @@
|
||||
<title>Описание конфигурационных файлов</title>
|
||||
<section id="context.xml">
|
||||
<title>context.xml</title>
|
||||
<para>TODO</para>
|
||||
<para>Файл <filename>context.xml</filename> является дескриптором развертывания приложения на сервере <application>Apache Tomcat</application>. В развернутом приложении этот файл располагается в подкаталоге <filename>META-INF</filename> каталога веб-приложения или WAR-файла, например <filename>tomcat/webapps/app-core/META-INF/context.xml</filename>. В проекте файлы данного типа находятся в каталогах <filename>/web/META-INF</filename> модулей <structname>core</structname>, <structname>web</structname>, <structname>portal</structname>.</para>
|
||||
<para>Основное предназначение файла для блока <structname>Middleware</structname> - определить источник данных и поместить его в JNDI под именем, заданным свойством приложения <property>
|
||||
<link linkend="cuba.dataSourceJndiName">cuba.dataSourceJndiName</link>
|
||||
</property>.</para>
|
||||
<para>Пример определения источника данных для <application>PostgreSQL</application>:<programlisting><Resource
|
||||
name="jdbc/CubaDS"
|
||||
type="javax.sql.DataSource"
|
||||
maxActive="20"
|
||||
maxIdle="2"
|
||||
maxWait="5000"
|
||||
driverClassName="org.postgresql.Driver"
|
||||
username="cuba"
|
||||
password="cuba"
|
||||
url="jdbc:postgresql://localhost/sales"/></programlisting></para>
|
||||
<para>Пример определения источника данных для <application>Microsoft SQL Server</application>:<programlisting><Resource
|
||||
name="jdbc/CubaDS"
|
||||
type="javax.sql.DataSource"
|
||||
maxActive="20"
|
||||
maxIdle="2"
|
||||
maxWait="5000"
|
||||
driverClassName="net.sourceforge.jtds.jdbc.Driver"
|
||||
username="sa"
|
||||
password="saPass1"
|
||||
url="jdbc:jtds:sqlserver://localhost/sales"/></programlisting></para>
|
||||
<para>Для всех <link linkend="app_tiers">блоков</link>, являющихся веб-приложениями, данный файл может содержать код, отключающий сериализацию HTTP-сессий:<programlisting><Manager className="org.apache.catalina.session.PersistentManager" debug="0" distributable="false"
|
||||
saveOnRestart="false">
|
||||
<Store className="org.apache.catalina.session.FileStore"/>
|
||||
</Manager></programlisting></para>
|
||||
</section>
|
||||
<section id="datatypes.xml">
|
||||
<title>datatypes.xml</title>
|
||||
@ -123,6 +150,9 @@
|
||||
</section>
|
||||
<section id="persistence.xml">
|
||||
<title>persistence.xml</title>
|
||||
<para>В зависимости от выбранного значения свойства приложения <property>
|
||||
<link linkend="cuba.dbmsType">cuba.dbmsType</link>
|
||||
</property> автоматически формируются параметры ORM, которые на старте приложения записываются в итоговый файл <filename>persistence.xml</filename> в <link linkend="work_dir">рабочем каталоге</link> приложения.</para>
|
||||
<para>TODO</para>
|
||||
</section>
|
||||
<section id="remoting-spring.xml">
|
||||
@ -241,6 +271,15 @@
|
||||
<para>Используется в блоках <structname>Web Client</structname> и <structname>Middleware</structname>.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry id="cuba.automaticDatabaseUpdate">
|
||||
<term>cuba.automaticDatabaseUpdate</term>
|
||||
<listitem>
|
||||
<para>Включает режим <link linkend="db_update">автоматического обновления базы данных</link> на старте приложения.</para>
|
||||
<para>Значение по умолчанию: <code>false</code></para>
|
||||
<para>Интерфейс: <code>ServerConfig</code></para>
|
||||
<para>Используется в блоке <structname>Middleware</structname>.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry id="cuba.availableLocales">
|
||||
<term>cuba.availableLocales</term>
|
||||
<listitem>
|
||||
@ -254,6 +293,31 @@
|
||||
<para>Используется во всех стандартных <link linkend="app_tiers">блоках</link>.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry id="cuba.dataSourceJndiName">
|
||||
<term>cuba.dataSourceJndiName</term>
|
||||
<listitem>
|
||||
<para>Задает имя источника данных в JNDI.</para>
|
||||
<para>Значение по умолчанию: <literal>java:comp/env/jdbc/CubaDS</literal></para>
|
||||
<para>Используется в блоке <structname>Middleware</structname>.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry id="cuba.dbDir">
|
||||
<term>cuba.dbDir</term>
|
||||
<listitem>
|
||||
<para>Конфигурационный параметр, задающий расположение <link linkend="db_dir">каталога скриптов базы данных</link>.</para>
|
||||
<para>Значение по умолчанию: <literal>${catalina.home}/webapps/${cuba.webContextName}/WEB-INF/db</literal>, что означает расположение в подкаталоге <filename>WEB-INF/db</filename> каталога текущего веб-приложения <application>Tomcat</application>.</para>
|
||||
<para>Интерфейс: <code>ServerConfig</code></para>
|
||||
<para>Используется в блоке <structname>Middleware</structname>.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry id="cuba.dbmsType">
|
||||
<term>cuba.dbmsType</term>
|
||||
<listitem>
|
||||
<para>Задает тип используемой базы данных. Возможные значения соответствуют значениям перечисления <code>DbmsType</code> без учета регистра: <literal>hsql</literal>, <literal>postgres</literal>, <literal>mssql</literal>.</para>
|
||||
<para>Значение по умолчанию: <literal>hsql</literal></para>
|
||||
<para>Используется в блоке <structname>Middleware</structname>.</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry id="cuba.defaultQueryTimeoutSec">
|
||||
<term>cuba.defaultQueryTimeoutSec</term>
|
||||
<listitem>
|
||||
|
@ -1,10 +0,0 @@
|
||||
<Resource
|
||||
name="jdbc/CubaDS"
|
||||
type="javax.sql.DataSource"
|
||||
maxActive="20"
|
||||
maxIdle="2"
|
||||
maxWait="5000"
|
||||
driverClassName="net.sourceforge.jtds.jdbc.Driver"
|
||||
username="sa"
|
||||
password="saPass1"
|
||||
url="jdbc:jtds:sqlserver://localhost/refapp"/>
|
@ -1,10 +0,0 @@
|
||||
<Resource
|
||||
name="jdbc/CubaDS"
|
||||
type="javax.sql.DataSource"
|
||||
maxActive="20"
|
||||
maxIdle="2"
|
||||
maxWait="5000"
|
||||
driverClassName="org.postgresql.Driver"
|
||||
username="root"
|
||||
password="root"
|
||||
url="jdbc:postgresql://localhost/refapp"/>
|
@ -1 +0,0 @@
|
||||
cuba.dbmsType=mssql
|
@ -1 +0,0 @@
|
||||
cuba.dbmsType=postgres
|
@ -1 +0,0 @@
|
||||
Instance -> Properties -> Security (Server authentification: SQL Server and Windows Authentification mode)
|
@ -1,3 +0,0 @@
|
||||
Sql Server Configuration Manager -> SQL Server Network Configuration -> Protocols for SQLEXPRESS -> TCP/IP -> Properties
|
||||
General -> Enabled : Yes
|
||||
IP Addresses -> IP All -> TCP Port : 1433
|
@ -1,3 +0,0 @@
|
||||
Instance -> Security -> Logins -> sa -> Properties ->
|
||||
General (Задать пароль)
|
||||
Status (Login: Enabled)
|
Loading…
Reference in New Issue
Block a user