jdbc:log4jdbc_使用Log4jdbc记录JDBC操作

jdbc:log4jdbc

当我们开发任何应用程序,完成它或结束其任何模块时,我们都会开始优化过程。 大多数应用程序都包含数据库访问权限,如果您使用的是ORM ,则可能会使用hibernate 。 优化Hibernate持久层,要求准备阅读,理解和评估sql

如果我们对Hibernate配置进行概述则应启用两个属性hibernate.format_sqlhibernate.use_sql_comments,以通过控制台打印执行的sql代码。

这是一个好的开始,但似乎我们需要更多信息来准确诊断性能,例如连接事件,查询返回的数据或参数绑定( Hibernate显示带问号?的参数值)。 因此,我们需要另一种检查生成的sql的方法Log4jdbc是一个jdbc驱动程序,可以记录sql / jdbc调用。 实际上, log4jdbc是代理模式的实现,它将自动加载流行的jdbc驱动程序( Oracle,Derby,MySql,PostgreSql,H2,Hsqldb等),拦截调用,记录信息,然后将数据发送到“ 间谍 ”驱动程序。

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模板创建的项目,该项目包含两个与一对多关系相关联的实体OrderItem ,以及一个执行一些数据库操作的测试。
首先要做的是将log4jdb-remixslf4j-log4j12依赖项添加到项目中:

<dependency><groupId>org.slf4j<groupId><artifactId>slf4j-log4j12<artifactId><version>1.6.4<version><dependency><dependency><groupId>org.lazyluke<groupId><artifactId>log4jdbc-remix<artifactId><version>0.2.7<version><dependency>

接下来要做的是配置活动记录器。 根据我们要监视的数据,我们激活所需的记录器。 作为示例,让我们配置log4j.xml,以便以表格式打印结果集,并显示执行每个查询所花费的时间。

<?xml version='1.0' encoding='UTF-8' ?><!DOCTYPE log4j:configuration SYSTEM 'log4j.dtd'><log4j:configuration xmlns:log4j='http:jakarta.apache.orglog4j'><appender name='console-log4jdbc' class='org.apache.log4j.ConsoleAppender'><param name='Target' value='System.out' ><layout class='org.apache.log4j.PatternLayout'><param name='ConversionPattern' value='%m%n' ><layout><appender><!--  <logger name='jdbc.sqlonly' additivity='false'> --><!--   <level value='debug' > --><!--   <appender-ref ref='console-log4jdbc' > --><!--  <logger> --><logger name='jdbc.sqltiming' additivity='false'><level value='info' ><appender-ref ref='console-log4jdbc' ><logger><!--  <logger name='jdbc.connection' additivity='false'> --><!--   <level value='info' > --><!--   <appender-ref ref='console-log4jdbc' > --><!--  <logger> --><!-- log4jdbc option log the jdbc results as a table --><logger name='jdbc.resultsettable' additivity='false'><level value='info' ><appender-ref ref='console-log4jdbc' ><logger><log4j: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_ID=1 where id=1  {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_ID=2 where id=2  {executed in 0 msec}select order0_.id as id1_0_, order0_.customer as customer1_0_ from T_ORDER order0_ where order0_.id=2 {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_id=order1_.id where items0_.ORDER_ID=2  {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_ID=3 where id=3  {executed in 0 msec}select order0_.id as id1_, order0_.customer as customer1_ from T_ORDER order0_ inner join Item items1_ on order0_.id=items1_.ORDER_ID where items1_.product='foo' 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_id=order1_.id where items0_.ORDER_ID=3  {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中配置了记录器,则将包括执行该sql的类名和行号(如果有)。 在INFO中将仅包含sql ,最后包含ERROR ,如果发生任何SQLException则显示堆栈跟踪。

优化Hibernate应用程序可能意味着接触到应用程序的许多部分( JVM配置,数据库引擎,网络等),但是要注意的一个非常重要的方面是发送到RDBMS的查询数量(例如N + 1问题),以及从数据库中检索到的数据量(投影问题)和log4jdbc-remix完全适合于此目的。

作为最后一点,log4jdbc( - 混音 )是一个JDBC记录,所以没有必要只在Hibernate应用程序使用,可以与任何框架一起使用,使用一个数据源

希望该库对您有所帮助。

保持学习,

下载代码

参考:来自JCG合作伙伴 Alex Soto的Log4jdbc记录JDBC操作,位于One Jar To Rule Them All博客上。


翻译自: https://www.javacodegeeks.com/2012/05/log-jdbc-operations-with-log4jdbc.html

jdbc:log4jdbc

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/355715.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mac 编译安装 Redis-3.2.3

Redis官方下载地址&#xff1a;http://redis.io/download Redis安装 cd /usr/local/src/redis-3.2.3 sudo make sudo make installcp ./src/redis-benchmark /usr/local/redis/redis-3.2 cp ./src/redis-check-aof /usr/local/redis/redis-3.2 cp ./src/redis-check-rdb /usr/l…

linux c mysql教程_linux下c操作mysql之增删改查

书接上文,继续进行linux 下c操作mysql。1.创建表/插入数据mysql> desc children-> ;----------------------------------------------------------| Field | Type| Null | Key | Default | Extra |----------------------------------------------------------| childno …

ios系统python编译器_MacBook如何安装Python编译器-百度经验

编程是一门需要动手实践的技能&#xff0c;由于Python的性能&#xff0c;许多人都将其作为学习编程的入门语言。而要想学好Python&#xff0c;首先要在电脑上安装Python&#xff0c;并安装一个可以解释Python的文本编辑器。在此以在MacBook上安装Sublime Text为例。 工具/原料 …

jvm需要多长时间进行转义分析? 可能比您想象的要长。

这篇文章着眼于转义分析&#xff0c;特别是jvm在运行的程序中执行转义分析需要多长时间。 我做了一些观察&#xff0c;但目前还没有全部解释。 作为介绍&#xff0c;让我们绕道看看jvm -Xcomp中一个鲜为人知且使用更少的标志&#xff08;这将是一件好事&#xff09;。 该标志…

Java补漏(一)

&#xfeff;&#xfeff;第一章前言 在学长的建议下&#xff0c;为了弥补之前学Java漏下的或者不是非常清楚的知识点&#xff0c;买了本蛮好的教科书-《Java学习笔记&#xff08;JDK6&#xff09;》&#xff0c;正式又一次学习。为了记下一些让我恍然大悟的知识。写了本文档。…

子集和问题 算法_子集问题 主要是去重算法

给定一个可能包含重复元素的整数数组 nums&#xff0c;返回该数组所有可能的子集&#xff08;幂集&#xff09;。说明&#xff1a;解集不能包含重复的子集。示例:输入: [1,2,2]输出:[[2],[1],[1,2,2],[2,2],[1,2],[]]

mysql存储引擎使用教程_mysql教程:如何写MySQL存储引擎

在MySQL 5.1中开发一个存储引擎已经是比较方便了。所谓存储引擎实际上是按照MySQL的约定&#xff0c;提供某些接口的实现而已&#xff0c;如MySQL插入一条记录时将调用write_row方法&#xff0c;通过索引检索时将调用index_read和index_next方法等。MySQL与存储引擎之间的接口主…

express中connect-flash中间件的使用

在学习node的时候&#xff0c;flash是困扰我最久的一个中间件&#xff0c;之前一直都没有很好的理解&#xff0c;这里做一个总结。 参考自&#xff1a;http://yunkus.com/connect-flash-usage/ 什么是flash&#xff1f; The flash is a special area of the session used for s…

spring environment_程序员:Spring项目中简单几步实现多个动态数据源切换

每一个请求与其他的用户是面对不同的数据库&#xff0c;这就需要用到动态数据源切换&#xff0c;来满足不同数据库、不同数据表(不同数据源)的灵活调用。动态数据源切换满足mysql、oracle等主流数据库进行动态数据源切换。使用方法在 WEB-INF 目录下建立 lib 目录&#xff0c;并…

算法笔记_163:算法提高 最大乘积(Java)

目录 1 问题描述 2 解决方案 1 问题描述 问题描述对于n个数&#xff0c;从中取出m个数&#xff0c;如何取使得这m个数的乘积最大呢&#xff1f;输入格式第一行一个数表示数据组数每组输入数据共2行&#xff1a;第1行给出总共的数字的个数n和要取的数的个数m&#xff0c;1<n&…

ServletRequest startAsync()的用途有限

前段时间我遇到了Servlet 3.0中AsyncContext.start&#xff08;…&#xff09;的目的是什么&#xff1f; 题。 引用上述方法的Javadoc &#xff1a; 使容器调度线程&#xff08;可能从托管线程池中&#xff09;运行指定的Runnable 。 提醒大家&#xff0c; AsyncContext是Servl…

python3.7下载tensorflow_【AI初体验】在anaconda中python3.7版本安装Tensorflow 与 Keras来玩玩...

哈啰&#xff0c;大家好&#xff0c; 单纯分享自己摸索学习AI的过程&#xff0c; 在自己的文章【Python 超入门】(1) 心原一马从零开始带你学程序中&#xff0c; 记录了安装撰写python的工具-anaconda 的方法&#xff0c; 当时安装的版本是python3.7版&#xff0c; 但是据说目前…

com/mysql/jdbc/sqlerror_com.mysql.jdbc.sqlerror

at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1052)在MYSQL中的BLOB字段中插入图片&#xff0c;提示出错&#xff01;&#xff01;&#xff01;加载MYSQL驱动成功com.mysql.jdbc.JDBC4Connection1479febc:\Users\hjx\Desktop\pic.jpgfile:8202com/search?q38…

Cocos2d-x3.1FileUtilsTest使用

Cocos2d-x3.1中FileUtils的使用&#xff1a;本使用教程是基于HelloWorld的。仅仅需在HelloWorld的init()函数中加入例如以下代码 //头文件 #include "platform/CCFileUtils.h"//FileUtils头文件 #include <stdio.h>//使用文件操作 #include "deprecated/C…

古巴平台上的通用过滤器–类固醇上的excel过滤器

正如我上次承诺的那样&#xff0c;我计划浏览该平台的某些功能&#xff0c;这些功能我认为非常有价值。 所以我将在这里做一些系列。 从明显的用户界面&#xff0c;过滤&#xff0c;安全性到一些高级功能&#xff08;如Web Portal&#xff0c;可扩展性&#xff0c;审核&#xf…

python关键字详解_Python 中的关键字with详解

在 Python 2.5 中&#xff0c;with关键字被加入。它将常用的 try ... except ... finally ...模式很方便的被复用。看一个最经典的例子&#xff1a; with open(file.txt) as f: content f.read() 在这段代码中&#xff0c;无论with中的代码块在执行的过程中发生任何情况&#…

python interactive window_如果PySide应用程序是从IPython interactive cons运行的,上下文菜单就会消失...

在下面给出的最小示例中&#xff0c;上下文菜单(右键单击gui的白色部分)仅短暂显示&#xff0c;然后消失。如果应用程序是从IPython(0.13.1)控制台启动的&#xff0c;则会出现这种情况。当从shell正常启动时&#xff0c;它可以正常工作。在import sysfrom PySide import QtGui,…

基准测试:Java 8 Lambda和流如何使您的代码慢5倍

与长期的实现相比&#xff0c;Java 8 lambda和流的性能如何&#xff1f; Lambda表达式和流在Java 8中受到了热烈的欢迎。这些是迄今为止很激动人心的功能&#xff0c;很长一段时间以来&#xff0c;它们就已经应用到Java中了。 新的语言功能使我们可以在代码中采用更具功能性的…

ssm框架逻辑删除mysql_MybatisPlus--CRUD接口及主键增长策略、自动填充、乐观锁更新数据...

目录一、insert1、插入操作2、主键策略二、update1、根据Id更新操作2、自动填充3、乐观锁三、select1、根据id查询记录2、通过多个id批量查询3、简单的条件查询4、分页四、delete1、根据id删除记录2、批量删除3、简单的条件查询删除4、逻辑删除一、insert1、插入操作RunWith(Sp…

python对英语的要求_学python需要英语基础吗

在很多人的眼里&#xff0c;学习编程需要英语基础&#xff0c;因为程序代码全是英文字母&#xff0c;如果没有英语基础可能很难学懂编程。程序代码是英文确实没有错&#xff0c;但是也不是必须得懂英语&#xff0c;因为计算机程序有自己语言&#xff0c;并不是我们生活中的英语…