邢台做网站可信赖,建行企业网站,网络设计具体学哪些,项城市住房和城乡建设局网站当我们开发任何应用程序#xff0c;完成它或结束其任何模块时#xff0c;我们都会开始优化过程。 大多数应用程序都包含数据库访问权限#xff0c;并且如果您使用的是ORM #xff0c;则可能会使用hibernate 。 优化休眠持久层#xff0c;要求准备阅读#xff0c;理解和评… 当我们开发任何应用程序完成它或结束其任何模块时我们都会开始优化过程。 大多数应用程序都包含数据库访问权限并且如果您使用的是ORM 则可能会使用hibernate 。 优化休眠持久层要求准备阅读理解和评估sql 。 如果我们对休眠配置进行概述则应启用两个属性hibernate.format_sql和hibernate.use_sql_comments以通过控制台打印执行的sql代码。 这是一个好的开始但是似乎我们需要更多信息来准确诊断性能例如连接事件查询返回的数据或参数绑定 休眠显示带问号的参数值。 因此我们需要另一种方法来检查生成的sql 。 Log4jdbc是一个jdbc驱动程序可以记录sql / jdbc调用。 实际上 log4jdbc是代理模式的实现它将自动加载流行的jdbc驱动程序 OracleDerbyMySqlPostgreSqlH2Hsqldb等拦截调用记录信息然后将数据发送到“ 间谍 ”驱动程序。 在log4jdbc中 根据要监视的数据可以使用5个记录器 jdbc.sqlonly 使用绑定参数替换为绑定数据来记录执行的sql 。 jdbc.sqltiming 记录执行一条SQL所花费的时间。 jdbc.audit 记录除ResultSets之外的所有jdbc调用。 jdbc.resultset 与jdbc.audit以及ResultsSets相同。 jdbc.connection 记录打开和关闭连接事件。 在本文中我们将了解如何配置log4jdbc-remix 这是log4jdbc的分支 除了继承log4jdbc功能之外还可以让我们 jdbc.resultsettable 以表格式记录结果集。 将其配置为数据源。 在Maven存储库中可用在Maven存储库中不存在log4jdbc 。 在此示例中我们将使用由JPA Spring模板创建的项目该项目包含两个与一对多关系相关联的实体Order和Item 以及一个执行某些数据库操作的测试。 首先要做的是将log4jdb-remix和slf4j-log4j12依赖项添加到项目中 dependencygroupIdorg.slf4jgroupIdartifactIdslf4j-log4j12artifactIdversion1.6.4versiondependencydependencygroupIdorg.lazylukegroupIdartifactIdlog4jdbc-remixartifactIdversion0.2.7versiondependency 接下来要做的是配置活动记录器。 根据我们要监视的数据我们激活所需的记录器。 作为示例让我们配置log4j.xml以便以表格式打印结果集并显示执行每个查询所花费的时间。 ?xml version1.0 encodingUTF-8 ?!DOCTYPE log4j:configuration SYSTEM log4j.dtdlog4j:configuration xmlns:log4jhttp:jakarta.apache.orglog4jappender nameconsole-log4jdbc classorg.apache.log4j.ConsoleAppenderparam nameTarget valueSystem.out layout classorg.apache.log4j.PatternLayoutparam nameConversionPattern value%m%n layoutappender!-- logger namejdbc.sqlonly additivityfalse --!-- level valuedebug --!-- appender-ref refconsole-log4jdbc --!-- logger --logger namejdbc.sqltiming additivityfalselevel valueinfo appender-ref refconsole-log4jdbc logger!-- logger namejdbc.connection additivityfalse --!-- level valueinfo --!-- appender-ref refconsole-log4jdbc --!-- logger --!-- log4jdbc option log the jdbc results as a table --logger namejdbc.resultsettable additivityfalselevel valueinfo appender-ref refconsole-log4jdbc loggerlog4j:configuration 配置记录器后运行测试并检查输出 create table Item (id bigint generated by default as identity, price double not null, product varchar(255), quantity integer not null, order_id bigint, primary key (id)) {executed in 10 msec}create table T_ORDER (id bigint generated by default as identity, customer varchar(255), primary key (id)) {executed in 1 msec}alter table Item add constraint FK22EF339F325255 foreign key (order_id) references T_ORDER {executed in 11 msec}insert into T_ORDER (id, customer) values (null, NULL) {executed in 1 msec}insert into Item (id, order_id, price, product, quantity) values (null, NULL, 0.0, NULL, 0) {executed in 0 msec}batching 1 statements: 0: update Item set ORDER_ID1 where id1 {executed in 2 msec}insert into T_ORDER (id, customer) values (null, NULL) {executed in 0 msec}insert into Item (id, order_id, price, product, quantity) values (null, NULL, 0.0, NULL, 0) {executed in 0 msec}batching 1 statements: 0: update Item set ORDER_ID2 where id2 {executed in 0 msec}select order0_.id as id1_0_, order0_.customer as customer1_0_ from T_ORDER order0_ where order0_.id2 {executed in 0 msec}|---------|---------||ID |CUSTOMER ||---------|---------||[unread] |null ||---------|---------|select items0_.ORDER_ID as ORDER5_1_2_, items0_.id as id2_, items0_.id as id0_1_, items0_.order_id as order5_0_1_, items0_.price as price0_1_, items0_.product as product0_1_, items0_.quantity as quantity0_1_, order1_.id as id1_0_, order1_.customer as customer1_0_ from Item items0_ left outer join T_ORDER order1_ on items0_.order_idorder1_.id where items0_.ORDER_ID2 {executed in 0 msec}|---------|---|---|---------|------|--------|---------|---|---------||ORDER_ID |ID |ID |ORDER_ID |PRICE |PRODUCT |QUANTITY |ID |CUSTOMER ||---------|---|---|---------|------|--------|---------|---|---------||2 |2 |2 |2 |0.0 |null |0 |2 |[unread] ||---------|---|---|---------|------|--------|---------|---|---------|insert into T_ORDER (id, customer) values (null, NULL) {executed in 0 msec}insert into Item (id, order_id, price, product, quantity) values (null, NULL, 0.0, foo, 0) {executed in 0 msec}batching 1 statements: 0: update Item set ORDER_ID3 where id3 {executed in 0 msec}select order0_.id as id1_, order0_.customer as customer1_ from T_ORDER order0_ inner join Item items1_ on order0_.iditems1_.ORDER_ID where items1_.productfoo limit 2 {executed in 6 msec}|---|---------||ID |CUSTOMER ||---|---------||3 |null ||---|---------|select items0_.ORDER_ID as ORDER5_1_2_, items0_.id as id2_, items0_.id as id0_1_, items0_.order_id as order5_0_1_, items0_.price as price0_1_, items0_.product as product0_1_, items0_.quantity as quantity0_1_, order1_.id as id1_0_, order1_.customer as customer1_0_ from Item items0_ left outer join T_ORDER order1_ on items0_.order_idorder1_.id where items0_.ORDER_ID3 {executed in 0 msec}|---------|---|---|---------|------|--------|---------|---|---------||ORDER_ID |ID |ID |ORDER_ID |PRICE |PRODUCT |QUANTITY |ID |CUSTOMER ||---------|---|---|---------|------|--------|---------|---|---------||3 |3 |3 |3 |0.0 |foo |0 |3 |[unread] ||---------|---|---|---------|------|--------|---------|---|---------| 输出以一种时尚的格式打印查询包含绑定参数不是问号并且还通知了处理时间。 请注意记录或多或少的信息仅是配置日志的问题。 此外根据日志级别将在每种情况下提供或多或少的信息。 如果在DEBUG中配置了logger则将包括执行该sql的类名和行号如果有。 在INFO中将仅包含sql 最后包含ERROR 如果发生任何SQLException则显示堆栈跟踪。 优化休眠应用程序可能意味着接触到应用程序的许多部分 JVM配置数据库引擎网络等但是要注意的一个非常重要的方面是发送到RDBMS的查询的数量例如N 1问题以及从数据库中检索到的数据量投影问题和log4jdbc-remix完全适合于此目的。 作为最后一点log4jdbc - 混音 是一个JDBC记录所以没有必要只在Hibernate应用程序使用可以与任何框架一起使用使用一个数据源 。 希望该库对您有所帮助。 保持学习 下载代码 参考在One Jar To Rulem All博客中我们的JCG合作伙伴 Alex Soto 使用Log4jdbc记录了JDBC操作 。 翻译自: https://www.javacodegeeks.com/2012/05/log-jdbc-operations-with-log4jdbc.html