我刚刚下载了带有源代码的openunderwriter保险解决方案,并将其设置为打开并从Eclipse运行。该项目使用Liferay框架,它还使用Hibernate在MySQL数据库中进行数据持久化。我想以某种方式启用调试从Hibernate发送到MySQL服务器的SQL查询,只要我在应用程序中执行CRUD操作。
我在SO和其他地方发现了许多类似的问题,例如this,this和this等等。我试图跟随他们,但无法在控制台上打印查询。一个问题是项目中有超过15个log4j.properties
个文件。我已用相关属性更新了所有这些属性,但到目前为止无济于事。我是Hibernate的新手,并且对Liferay框架一无所知。如何在openunderwriter中启用SQL调试?
编辑:我已经通过从bitbucket存储库克隆它并按照安装说明在Eclipse中打开它来设置openunderwriter。它使用Ant构建。我可以使用Eclipse中的Ant命令成功启动/停止/构建它,并使用浏览器中的应用程序。我在存储库中找不到[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,CONSOLE
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
答案 0 :(得分:1)
tl;博士摘要在这篇文章的底部
Liferay是一个基于Java的开源门户平台。 Liferay是一个门户网站,拥有强大的用户帐户管理系统(角色,组,权限等),内容管理功能,可扩展的文档存储,最重要的是用于开发自定义应用程序和扩展Liferay门户网站的优秀SDK。
Open Underwriter似乎使用Liferay 6.2作为它的下划线门户。 Essentially Open Underwrites应用程序只是扩展了Liferay门户以适应特定的业务领域,但是下划线结构只是门户的扩展,而不是一个完全独立的产品。 Liferay支持大多数主要的应用程序服务器/ servlet容器,Open Underwriter似乎使用 JBoss 作为它的应用程序服务器。
Liferay默认使用了许多不同的应用程序。 Liferay将这些应用程序称为插件(我将从现在开始将其称为这些应用程序)。 Liferay 6.2及以下版本使用JSR-286 portlet(常规portlet和服务构建器portlet),钩子(和自适应钩子),扩展和布局模板来构建应用程序并扩展平台。 Liferay 7.0和DXP(企业版7.0)使用基于Apache Felix的OSGi模块来构建和扩展门户。
您可以在以下位置找到这些插件
[OPEN_UNDERWRITER_HOME]/liferay-portal-6.2.0-ce-ga1/jboss-7.1.1/standalone/deployments
更改Liferay门户的配置(例如以特定类型的方式记录查询)不是通过直接修改这些文件来完成的(除非您构建自己的插件)。
Liferay具有用于配置和扩展门户及相关技术的扩展点。在较高级别,您要么扩展或更改以下四个组件之一的配置
Liferay的对象关系映射组件称为 Service Builder ,它本身只是一个使用 Hibernate 和 EclipseLink 的JPA实现。< / p>
每个插件(与数据库交互)都有一个名为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日志,而是来自与该插件关联的service.xml
文件生成的SQL。您无法直接修改这些文件,因为在该插件的构建过程中它们将被覆盖。
要正确记录hibernate查询,您应该修改以下文件
[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
如果您要解决性能问题,可能还需要添加以下内容来跟踪hibernate会话
log4j.logger.org.hibernate.impl.SessionImpl=TRACE
portal.properties是包含门户网站配置的属性文件。您永远不会直接修改它,而是修改portal-ext.properties。但是,您可能(或可能不)注意到同一目录中的其他四个属性文件
- portal-bundle.properties
- portal-ext.properties
- portal-setup-wizard.properties
- 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目录下的日志文件夹是应用服务器日志文件。它可能包含有用的信息,但不包含您要查找的查询。
我并不完全知道你为什么要查看hibernate查询,但我认为这是出于性能原因。首先,不要在生产中打开它。它会减慢你的机器速度。其次,您可能需要考虑打开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
如果您认为性能问题与数据库相关,那么您关注的属性位于以下两个小节之间
MySQL查询执行计划
https://dev.mysql.com/doc/refman/5.7/en/execution-plan-information.html
最后,将来当您研究与Open Underwriter相关的技术问题时,我强烈建议您查找Liferay平台中使用的技术特有的内容。这些技术以非常特殊的方式实现,我建议您将搜索重点放在Liferay上(将hibernate作为次要搜索条件)。如果您无法遵循我在上面发布的信息,或者如果您需要其他帮助,请回复,我们可以进行讨论。
此外,我不确定您在实施此解决方案中的角色,但New Relic APM监控确实帮助我们在生产中管理我们的企业Liferay平台。如果您的问题是通过我的帖子历史记录查看性能,我相信我写了一篇关于配置生产环境的一些最佳实践的非常详尽的帖子(尽管每个部署都不同)