Дамп SQL-запросов из Hibernate в OpenUnderWriter - PullRequest
0 голосов
/ 26 апреля 2018

Я только что скачал openunderwriter страховое решение с исходным кодом и настроил его на запуск и запуск из Eclipse. В проекте используется среда Liferay, а также Hibernate для сохранения данных в базе данных MySQL. Я хочу как-то включить отладку SQL-запросов, которые отправляются на сервер MySQL из Hibernate при выполнении операции CRUD в приложении.

Я нашел много похожих вопросов по SO и в других местах, таких как это , это и это и многие другие. Я пытался следить за ними, но не смог распечатать запросы на консоли. Одна проблема состоит в том, что в проекте более 15 log4j.properties файлов. Я обновил их все соответствующие свойства, но пока безрезультатно. Я новичок в Hibernate и ничего не знаю о фреймворке Liferay. Как включить отладку SQL в openunderwriter ?

Редактировать: Я установил openunderwriter, клонировав его из репозитория bitbucket и следуя инструкциям по установке, чтобы открыть его в Eclipse. Он использует сборки Ant. Я могу успешно запустить / остановить / собрать его с помощью команд Ant из Eclipse и использовать приложение из браузера. Я не смог найти каталог [OPEN_UNDERWRITER_HOME]/liferay-portal-6.2.0-ce-ga1 в хранилище. Тем не менее, я нашел

[OpenUnderWriterHome]\system\target\liferay-portal-6.2-ce-ga6\

каталог. И я внес изменения в файл log4j.properties в следующем каталоге, предполагая, что *g1 и '* g6` указывают на разницу в версии

D:\OpenUnderWriter\OpenUnderWriterRepo\system\target\liferay-portal-6.2-ce-ga6\jboss-7.1.1\standalone\deployments\ROOT.war\WEB-INF\classes

Содержимое файла log4j.properties в каталоге выше выглядит следующим образом log4j.rootLogger = INFO, КОНСОЛЬ

log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.EnhancedPatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ABSOLUTE} %-5p [%c{1}:%L] %m%n
log4j.logger.org.hibernate.SQL=debug
log4j.logger.org.hibernate.type=trace
log4j.logger.org.hibernate.jdbc=DEBUG
log4j.logger.org.hibernate.transaction=DEBUG

Но когда я захожу в файлы журналов в D:\OpenUnderWriter\OpenUnderWriterRepo\system\target\liferay-portal-6.2-ce-ga6\logs, нет запросов sql и значений параметров. Тем не менее, консоль Eclipse показывает sql запросы, но показывает их с отметками ? вместо значений параметров. И даже отображение запросов происходит из-за свойства show_sql=true, установленного в файле HibernateConfiguration.xml. Если я удаляю это свойство и перестраиваю код, запросы также перестают отображаться в консоли. Что-то не так я делаю?

Редактировать 2:
У меня есть два HibernateConfiguration.xml файла. Первый в D:\OpenUnderWriter\OpenUnderWriterRepo\system\target\test\integration-test.jar\com\ail\core\persistence\hibernate, а второй в D:\OpenUnderWriter\OpenUnderWriterRepo\system\modules\com\ail\core.jar\com\ail\core\persistence\hibernate. Содержимое обоих файлов соответственно как в

<?xml version='1.0' encoding='utf-8'?> 
<!DOCTYPE hibernate-configuration PUBLIC 
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 

<hibernate-configuration>

    <session-factory>

        <property name="org.hibernate.envers.track_entities_changed_in_revision">true</property>
        <property name="org.hibernate.envers.audit_table_suffix">_</property>

        <!-- Database connection settings --> 
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property> 
        <property name="connection.url">jdbc:mysql://@dbhost@:3306/@dbname.openunderwriter@</property> 
        <property name="connection.username">@dbusername@</property> 
        <property name="connection.password">@dbpassword@</property> 
        <property name="connection.pool_size">1</property> 

        <!-- Enable Hibernate's automatic session context management --> 
        <property name="current_session_context_class">thread</property> 

        <!-- SQL dialect --> 
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property> 

        <property name="hibernate.bytecode.use_reflection_optimizer">true</property>
        <property name="hibernate.show_sql">true</property>
        <property name="hibernate.format_sql">true</property>
        <property name="use_sql_comments">true</property>
        <property name="hibernate.hbm2ddl.auto">create</property>

        <!-- Mappings for all classes come from one place -->
        <mapping class="com.ail.core.Attribute" />
        <mapping class="com.ail.core.ForeignSystemReference" />
        <mapping class="com.ail.core.Note" />
        <mapping class="com.ail.core.Reference" />
        <mapping class="com.ail.core.PageVisit" />
        <mapping class="com.ail.core.Type" />
        <mapping class="com.ail.core.Version" />
        <mapping class="com.ail.core.audit.envers.Revision" /> 
        <mapping class="com.ail.core.document.Document" /> 
        <mapping class="com.ail.core.document.DocumentContent" /> 
        <mapping class="com.ail.core.document.DocumentPlaceholder" /> 
        <mapping class="com.ail.core.document.DocumentRequest" /> 
        <mapping class="com.ail.core.key.UniqueKey" /> 
        <mapping class="com.ail.core.logging.ServiceRequestRecord" />
        <mapping class="com.ail.core.product.ProductChangeEvent" />
        <mapping class="com.ail.core.product.ProductUpgradeLog" />
        <mapping class="com.ail.financial.CurrencyAmount" />
        <mapping class="com.ail.financial.DirectDebit" />
        <mapping class="com.ail.financial.Eway" />
        <mapping class="com.ail.financial.IWinPay" />
        <mapping class="com.ail.financial.MoneyProvision" />
        <mapping class="com.ail.financial.Orange" />
        <mapping class="com.ail.financial.PaymentCard" />
        <mapping class="com.ail.financial.PaymentHoliday" /> 
        <mapping class="com.ail.financial.PaymentMethod" />
        <mapping class="com.ail.financial.PaymentRecord" />
        <mapping class="com.ail.financial.PaymentSchedule" />
        <mapping class="com.ail.financial.PayPal" />
        <mapping class="com.ail.financial.SagePay" />
        <mapping class="com.ail.financial.Stripe" />
        <mapping class="com.ail.financial.ledger.Account" />
        <mapping class="com.ail.financial.ledger.AccountingPeriod" />
        <mapping class="com.ail.financial.ledger.Balance" />
        <mapping class="com.ail.financial.ledger.Journal" />
        <mapping class="com.ail.financial.ledger.JournalLine" />
        <mapping class="com.ail.financial.ledger.Ledger" />
        <mapping class="com.ail.insurance.claim.Claim" /> 
        <mapping class="com.ail.insurance.claim.ClaimRecovery" /> 
        <mapping class="com.ail.insurance.claim.ClaimSection" /> 
        <mapping class="com.ail.insurance.policy.AssessmentSheet" /> 
        <mapping class="com.ail.insurance.policy.Asset" /> 
        <mapping class="com.ail.insurance.policy.Broker" /> 
        <mapping class="com.ail.insurance.policy.Clause" /> 
        <mapping class="com.ail.insurance.policy.CommercialProposer" /> 
        <mapping class="com.ail.insurance.policy.Coverage" /> 
        <mapping class="com.ail.insurance.policy.PersonalProposer" /> 
        <mapping class="com.ail.insurance.policy.Policy" /> 
        <mapping class="com.ail.insurance.policy.Section" /> 
        <mapping class="com.ail.party.Address" /> 
        <mapping class="com.ail.party.ContactSystem" /> 
        <mapping class="com.ail.party.EmailAddress" /> 
        <mapping class="com.ail.party.Party" /> 
        <mapping class="com.ail.party.PartyRelationship" /> 
        <mapping class="com.ail.party.PartyRole" /> 
        <mapping class="com.ail.party.Person" /> 
        <mapping class="com.ail.party.PhoneNumber" /> 
        <mapping class="com.ail.party.Organisation" />
        <mapping class="com.ail.util.DateOfBirth" /> 

    </session-factory>

</hibernate-configuration> 

, а второй HibernateConfiguration.xml равен

    <?xml version='1.0' encoding='utf-8'?> 
    <!DOCTYPE hibernate-configuration PUBLIC 
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

    <hibernate-configuration>

        <session-factory>

            <property name="org.hibernate.envers.track_entities_changed_in_revision">true</property>
            <property name="org.hibernate.envers.audit_table_suffix">_</property>

            <!-- Enable Hibernate's automatic session context management -->
            <property name="current_session_context_class">jta</property>
            <property name="hibernate.current_session_context_class">jta</property>

            <property name="jta.UserTransaction">java:jboss/UserTransaction</property>

            <property name="hibernate.connection.datasource">java:/PersistenceDS</property>

            <property name="hibernate.transaction.factory_class">org.hibernate.transaction.CMTTransactionFactory</property>

            <property name="hibernate.transaction.manager_lookup_class">org.hibernate.transaction.JBossTransactionManagerLookup</property>

            <property 

name="hibernate.transaction.transaction.jta.platform">org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform</property>

        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>

        <property name="hibernate.bytecode.use_reflection_optimizer">true</property>
        <property name="hibernate.connection.isolation">2</property> <!-- read committed -->
        <property name="hibernate.generate_statistics">false</property>
        <property name="hibernate.show_sql">true</property>
        <property name="hibernate.format_sql">true</property>
        <property name="use_sql_comments">true</property>
        <property name="hibernate.hbm2ddl.auto">validate</property>

        <mapping class="com.ail.core.ForeignSystemReference" />
        <mapping class="com.ail.core.Note" />
        <mapping class="com.ail.core.Reference" />
        <mapping class="com.ail.core.Type" />
        <mapping class="com.ail.core.audit.envers.Revision" /> 
        <mapping class="com.ail.core.document.Document" /> 
        <mapping class="com.ail.core.document.DocumentContent" /> 
        <mapping class="com.ail.core.document.DocumentPlaceholder" /> 
        <mapping class="com.ail.core.document.DocumentRequest" /> 
        <mapping class="com.ail.core.key.UniqueKey" /> 
        <mapping class="com.ail.core.logging.ServiceRequestRecord" />
        <mapping class="com.ail.core.product.ProductChangeEvent" />
        <mapping class="com.ail.core.product.ProductUpgradeLog" />
        <mapping class="com.ail.financial.CurrencyAmount" />
        <mapping class="com.ail.financial.DirectDebit" />
        <mapping class="com.ail.financial.Eway" />
        <mapping class="com.ail.financial.IWinPay" />
        <mapping class="com.ail.financial.MoneyProvision" />
        <mapping class="com.ail.financial.Orange" />
        <mapping class="com.ail.financial.PaymentCard" />
        <mapping class="com.ail.financial.PaymentHoliday" /> 
        <mapping class="com.ail.financial.PaymentMethod" />
        <mapping class="com.ail.financial.PaymentRecord" />
        <mapping class="com.ail.financial.PaymentSchedule" />
        <mapping class="com.ail.financial.PayPal" />
        <mapping class="com.ail.financial.SagePay" />
        <mapping class="com.ail.financial.Stripe" />
        <mapping class="com.ail.financial.ledger.Account" />
        <mapping class="com.ail.financial.ledger.AccountingPeriod" />
        <mapping class="com.ail.financial.ledger.Balance" />
        <mapping class="com.ail.financial.ledger.Journal" />
        <mapping class="com.ail.financial.ledger.JournalLine" />
        <mapping class="com.ail.financial.ledger.Ledger" />
        <mapping class="com.ail.insurance.claim.Claim" /> 
        <mapping class="com.ail.insurance.claim.ClaimRecovery" /> 
        <mapping class="com.ail.insurance.claim.ClaimSection" /> 
        <mapping class="com.ail.insurance.policy.AssessmentSheet" /> 
        <mapping class="com.ail.insurance.policy.Asset" /> 
        <mapping class="com.ail.insurance.policy.Broker" /> 
        <mapping class="com.ail.insurance.policy.Clause" /> 
        <mapping class="com.ail.insurance.policy.CommercialProposer" /> 
        <mapping class="com.ail.insurance.policy.Coverage" /> 
        <mapping class="com.ail.insurance.policy.PersonalProposer" /> 
        <mapping class="com.ail.insurance.policy.Policy" /> 
        <mapping class="com.ail.insurance.policy.Section" /> 
        <mapping class="com.ail.party.Address" /> 
        <mapping class="com.ail.party.ContactSystem" /> 
        <mapping class="com.ail.party.EmailAddress" /> 
        <mapping class="com.ail.party.PartyRelationship" /> 
        <mapping class="com.ail.party.PartyRole" /> 
        <mapping class="com.ail.party.Party" /> 
        <mapping class="com.ail.party.Person" /> 
        <mapping class="com.ail.party.PhoneNumber" /> 
        <mapping class="com.ail.party.Organisation" />
        <mapping class="com.ail.util.DateOfBirth" /> 
    </session-factory>

</hibernate-configuration> 

Также в каталоге D:\OpenUnderWriter\OpenUnderWriterRepo\system\target\liferay-portal-6.2-ce-ga6 у меня нет файла portal.properties. Единственные файлы реквизита, которые у меня есть, это portal-ext.properties и portal-setup-wizard.properties. Содержание portal-ext.properties выглядит следующим образом

index.on.startup=true
javascript.fast.load=false
jdbc.default.driverClassName=com.mysql.jdbc.Driver
jdbc.default.password=password
jdbc.default.url=jdbc:mysql://localhost/OU_trunk_trunk_Liferay?useUnicode=true&characterEncoding=UTF-8&useFastDateParsing=false
jdbc.default.username=openquote
layout.user.private.layouts.auto.create=false
layout.user.private.layouts.enabled=false
layout.user.public.layouts.auto.create=false
layout.user.public.layouts.enabled=false
theme.portlet.decorate.default=false
velocity.engine.restricted.classes=
velocity.engine.restricted.variables=
web.server.https.port=8443
users.screen.name.allow.numeric=true
company.default.home.url=/web/ou/welcome

и содержание portal-setup-wizard.properties:

admin.email.from.name=Adam OpenUnderwriter
liferay.home=../..
admin.email.from.address=adam@openunderwriter.org
setup.wizard.enabled=false

1 Ответ

0 голосов
/ 29 апреля 2018

Основы Liferay

tl; dr резюме внизу этого поста

Liferay - платформа портала с открытым исходным кодом на основе Java. Liferay - это портал с надежной системой управления учетными записями пользователей (роли, группы, разрешения и т. Д.), Возможностями управления контентом, расширяемым хранилищем документов и, что наиболее важно, отличным SDK для разработки пользовательских приложений и расширения самого портала Liferay.

Похоже, что Open Underwriter использует Liferay 6.2 в качестве подчеркивающего портала. По сути, приложение Open Underwrites просто расширяет портал Liferay, чтобы соответствовать определенному бизнес-домену, но структура подчеркивания - это просто расширение портала, а не отдельный продукт. Liferay поддерживает большинство основных серверов приложений / контейнеров сервлетов, и, похоже, Open Underwriter использует JBoss в качестве сервера приложений.

Liferay поставляется по умолчанию с десятками различных приложений . Liferay называет эти приложения плагинами (и теперь я буду ссылаться на них как таковые). Liferay 6.2 и ниже использует портлеты JSR-286 (обычные портлеты и портлеты сборщика служб), ловушки (и адаптивные ловушки), расширения и шаблоны компоновки для создания приложений и расширения платформы. Liferay 7.0 и DXP (выпуск 7.0 для предприятий) используют модули OSGi на основе Apache Felix для построения и расширения портала.

Вы можете найти эти плагины в следующем месте

[OPEN_UNDERWRITER_HOME]/liferay-portal-6.2.0-ce-ga1/jboss-7.1.1/standalone/deployments

Конфигурация Liferay

Изменение конфигурации портала Liferay (например, для регистрации запросов определенного типа) НЕ производится путем непосредственного изменения этих файлов (если только вы не создаете собственный плагин).

Liferay имеет точки расширения, используемые для настройки и расширения портала и связанных с ним технологий. На высоком уровне вы расширяете или изменяете конфигурации для одного из следующих четырех компонентов

  1. Сам портал (и зависимости, используемые порталом)
  2. Отдельные плагины (модули, портлеты, хуки, расширения, адаптеры и т. Д.) Также известны как приложения , которые находятся на портале
  3. База данных
  4. Сервер приложений

Liferay's ORM (ServiceBuilder и Hibernate)

Компонент Liferay Object Relational Mapping называется Service Builder , который сам по себе является просто реализацией JPA с использованием Hibernate и EclipseLink .

Каждый плагин (который взаимодействует с базой данных) имеет файл с именем service.xml, который определяет ORM (объекты и связанные с ними запросы CRUD) и может быть найден в следующем месте

[OPEN_UNDERWRITER_HOME]/liferay-portal-6.2.0-ce-ga1/jboss-7.1.1/standalone/deployments/{portlet-name}/WEB-INF/service.xml

Кроме того, вы можете увидеть сгенерированный SQL, таблицы и индексы в следующем месте.

[OPEN_UNDERWRITER_HOME]/liferay-portal-6.2.0-ce-ga1/jboss-7.1.1/standalone/deployments/{portlet-name}/WEB-INF/sql/

В этом каталоге вы увидите четыре или пять файлов. Это НЕ журнал SQL, а скорее сгенерированный SQL из файла service.xml, связанного с этим плагином. Вы не можете изменять эти файлы напрямую, так как они будут перезаписаны в процессе сборки для этого плагина.

SQL времени выполнения

Чтобы правильно регистрировать запросы гибернации, вы должны изменить следующий файл

[OPEN_UNDERWRITER_HOME]/liferay-portal-6.2.0-ce-ga1/portal-ext.properties

Вы должны добавить следующее свойство внизу

hibernate.show_sql=true

Если этот файл уже существует, просто измените значение с false на true (по умолчанию используется значение false).

Сохраните файл и перезапустите сервер. Теперь запрос будет выведен в файл журнала Liferay в следующей форме:

insert into table1 (column1, column2) values (?, ?)

Знаки вопроса НЕ будут заменены фактическим значением запроса, и это из-за того, как hibernate готовит запросы (это технический термин, который означает что-то конкретное в случае Java / SQL).

Если вы хотите увидеть значения этих запросов, вам нужно изменить следующий файл:

[OPEN_UNDERWRITER_HOME]/liferay-portal-6.2.0-ce-ga1/jboss-7.1.1/standalone/deployments/ROOT/WEB-INF/classes/log4j.properties

Добавляя эти свойства (или изменяя значения, если они уже существуют)

log4j.logger.org.hibernate.SQL=debug
log4j.logger.org.hibernate.type=trace

Вы также можете добавить эти свойства

log4j.logger.org.hibernate.jdbc=DEBUG
log4j.logger.org.hibernate.transaction=DEBUG

И если вы устраняете проблему с производительностью, вы можете добавить следующее для отслеживания сессий спящего режима

log4j.logger.org.hibernate.impl.SessionImpl=TRACE

portal.properties - это файл свойств, который содержит конфигурацию портала. Вы никогда не изменяете это напрямую, а вместо этого изменяете portal-ext.properties. Однако вы можете (или не можете) заметить четыре других файла свойств в том же каталоге

  1. portal-bundle.properties
  2. portal-ext.properties
  3. portal-setup-wizard.properties
  4. portal-ide.properties

Все эти файлы переопределяют portal.properties, и они перечислены в порядке предпочтения. Другими словами, если у меня есть свойство в portal-bundle.properties, установленное в значение true, и то же свойство в portal-ide.properties, установленное в значение false, это свойство будет иметь значение false. Вы вряд ли увидите эти файлы, созданные.

Просмотр журнала

Возможно, вы заметили, что под домашним каталогом платформ есть несколько разных */log каталогов. После первого запуска сервера вы должны увидеть папку журнала здесь

[OPEN_UNDERWRITE_HOME]/liferay-portal-6.2.0-ce-ga1/logs

Это файлы журналов, которые вас больше всего интересуют. Папка журналов, расположенная под каталогом JBoss, является файлом журналов серверов приложений. Он может содержать полезную информацию, но не будет содержать запросы, которые вы ищете.

Заключительные мысли

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

Для этого найдите файл my.cnf и добавьте следующий

general_log_file = /var/logs/mysql.log
general_log = 1

Кроме того, после того, как вы начнете регистрироваться и найдете интересующие вас запросы, вы должны взглянуть на их план выполнения (ссылка в ссылках ниже).

Ссылки и дополнительные мысли

Вы можете найти исчерпывающий список свойств, используемых для переопределения portal.properties здесь (примечание - никогда не изменяйте сами portal.properties, изменяйте portal-ext.properties)

https://docs.liferay.com/portal/6.2/propertiesdoc/portal.properties.html

Если вы считаете, что проблема с производительностью связана с базой данных, то свойства, которые вас интересуют, находятся между следующими двумя подразделами

  1. https://docs.liferay.com/portal/6.2/propertiesdoc/portal.properties.html#Model%20Hints
  2. https://docs.liferay.com/portal/6.2/propertiesdoc/portal.properties.html#SQL%20Data

План выполнения запросов MySQL

https://dev.mysql.com/doc/refman/5.7/en/execution-plan-information.html

Наконец, в будущем, когда вы будете исследовать технические проблемы, связанные с Open Underwriter, я настоятельно рекомендую вам поискать вещи, специфичные для технологий, используемых в платформе Liferay. Эти технологии реализованы особым образом, и я предлагаю вам вместо этого сосредоточить свои поиски на Liferay (с гибернацией в качестве второстепенного критерия поиска). Если вы не можете следить за информацией, которую я разместил выше, или если вам нужна дополнительная помощь, пожалуйста, ответьте, и мы можем обсудить.

Кроме того, я не уверен, какова ваша роль в реализации этого решения, но мониторинг New Relic APM действительно помог нам управлять нашей корпоративной платформой Liferay в производстве. Если ваша проблема связана с производительностью, просмотрите мою историю публикаций, я думаю, что я написал очень подробный пост о некоторых рекомендациях по настройке рабочей среды (хотя каждое развертывание отличается)

...