使用Log4jdbc記錄JDBC操作

當我們開發任何應用程序,完成它或結束其任何模塊時,我們都會開始優化過程。 大多數應用程序都包含數據庫訪問權限,并且如果您使用的是ORM ,則可能會使用hibernate 。 優化休眠持久層,要求準備閱讀,理解和評估sql

如果我們對休眠配置進行概述則應啟用兩個屬性hibernate.format_sqlhibernate.use_sql_comments,以通過控制臺打印執行的sql代碼。

這是一個好的開始,但是似乎我們需要更多信息來準確診斷性能,例如連接事件,查詢返回的數據或參數綁定( 休眠顯示帶問號?的參數值)。 因此,我們需要另一種方法來檢查生成的sqlLog4jdbc是一個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中配置了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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/372916.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/372916.shtml
英文地址,請注明出處:http://en.pswp.cn/news/372916.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

android BluetoothAdapter藍牙BLE掃描總結

做室內定位的程序員應該都知道&#xff0c;在Android 5.0之后&#xff0c;google推出了藍牙掃描新接口&#xff0c;我們在實測中發現出一些問題&#xff0c;現在給大家列出&#xff0c;以供參考&#xff1a; 1.android 4.3.1(Build.VERSION_CODES.JELLY_BEAN_MR2)增加的startLe…

卷積神經網絡語音識別_用于物體識別的3D卷積神經網絡

本文提出了一種基于CNN的3D物體識別方法&#xff0c;能夠從3D圖像表示中識別3D物體&#xff0c;并在比較了不同的體素時的準確性。已有文獻中&#xff0c;3D CNN使用3D點云數據集或者RGBD圖像來構建3D CNNs&#xff0c;但是CNN也可以用于直接識別物體體積表示的體素。本文中&am…

段落排版--對齊(text-aliagn)

想為塊狀元素中的文本、圖片設置居中樣式嗎&#xff1f;可以使用text-align樣式代碼&#xff0c;如下代碼可實現文本居中顯示。(那么什么是塊狀元素呢&#xff1f;后面會講到呢~) h1{text-align:center; } <h1>了不起的蓋茨比</h1> 同樣可以設置居左&#xff1a; h…

Java 7:在不丟失數據的情況下關閉NIO.2文件通道

關閉異步文件通道可能非常困難。 如果您將I / O任務提交到異步通道&#xff0c;則需要確保正確執行了任務。 實際上&#xff0c;出于多種原因&#xff0c;這對于異步通道可能是一個棘手的要求。 默認的通道組使用守護進程線程作為工作線程&#xff0c;這不是一個好選擇&#xf…

JavaScript封裝方法,兼容參數類型為Number和String

/*** 依據Kind確定跳轉到目標列表頁面。* param kind*/function gobackByKind(kind) {var kindStr String(kind);switch(kindStr){case "1"://跳轉到客戶列表頁面window.location.href/biz/customer/list;break;case "2"://跳轉到代理機構列表頁面window.…

#獲得請求來源ip_以太網數據包TCP、IP、ICMP、UDP、ARP協議頭結構詳解

以太網首部目地MAC地址(8字節)源MAC地址(8字節)類型(2字節)1、IP頭的結構版本(4位)頭長度(4位)服務類型(8位)封包總長度(16位)封包標識(16位)標志(3位)片斷偏移地址(13位)存活時間(8位)協議(8位)校驗和(16位)來源IP地址(32位)目的IP地址(32位)選項(可選)填充(可選)數據(1)字節和…

團隊項目第二次沖刺Ⅶ

今天將整體代碼的編碼方式改了&#xff0c;作業模塊基本修改完成 遇到的問題是對于添加問答模塊無從下手轉載于:https://www.cnblogs.com/brucekun/p/5573312.html

編寫Play 2的模塊,第2部分:攔截器

在本教程的第一部分中&#xff0c;我們介紹了創建&#xff0c;發布和調用模塊的基本知識。 我們創建的模塊并沒有真正做很多事情&#xff0c;因此現在是時候使用Play的某些功能來擴展功能了。 1.攔截器 攔截器使您可以攔截對控制器的調用&#xff0c;并增強或阻止其行為。 在第…

c# ef報錯_C# EF調用MySql出現“未將對象引用設置到對象的實例”錯誤解決方案

C# EF調用MySql出現“未將對象引用設置到對象的實例”錯誤解決方案---修改步驟---1.打開Nuget管理包&#xff0c;把Mysql.Data替換為6.10.0以下任意版本。這里選擇的是6.8.82.修改完畢后&#xff0c;繼續把Mysql.Data.Entity也修改為對應版本6.8.8。3.安裝完成后可以看到App.Co…

js格式化時間

Date.prototype.format function(fmt) {var o { "M" : this.getMonth()1, //月份 "d" : this.getDate(), //日 "h" : this.getHours(), //小時 "m" : this.getMinu…

PHP---函數

一.函數定義的四個要素 返回類型&#xff0c;函數名&#xff0c;參數列表&#xff0c;函數體 //1.最簡單的定義方式/*function show(){ echo "hello";}show();*///2.有參數的函數定義/*function show($a){ echo $a;}show("bbbbb");*///3.有默認值的函數定義…

ServletRequest startAsync()的有用性有限

前段時間我遇到了Servlet 3.0中AsyncContext.start&#xff08;…&#xff09;的目的是什么&#xff1f; 題。 引用上述方法的Javadoc &#xff1a; 使容器調度線程&#xff08;可能從托管線程池中&#xff09;運行指定的Runnable 。 提醒大家&#xff0c; AsyncContext是Servl…

mysql所支持的比較運算符_mysql比較運算符有哪些?Mysql比較運算符詳解

比較運算符可用于比較數字和字符串。今天發一篇Mysql比較運算符詳解&#xff0c;希望對初學者有所幫助&#xff0c;雖然現在流行NoSQL&#xff0c;但是MYSQL還是很有用的&#xff0c;數字作為浮點值進行比較&#xff0c;字符串以不區為例進行比較&#xff0c;運算符用于比較表達…

數據結構0類模板的使用

類模板的使用 #include <iostream> #include <conio.h> #include <string> #define N 3 using namespace std;template <class numtype> class Swap{public :Swap(numtype a,numtype b){xa;yb;}numtype ___(){tempx;xy;ytemp;return x;}//testnumtype …

JavaScript 函數

函數 由于JavaScript的函數也是一個對象&#xff0c;所以類似function abs(v){}函數實際上是一個函數對象&#xff0c;而函數名abs可以視為指向該函數的變量。 因此&#xff0c;第二種定義函數的方式如下&#xff1a; var abs function (x) {if (x > 0) {return x;} else {…

Http Invoker的Spring Remoting支持

Spring HTTP Invoker是Java到Java遠程處理的重要解決方案。 該技術使用標準的Java序列化機制通過HTTP公開服務&#xff0c;并且可以被視為替代解決方案&#xff0c;而不是Hessian和Burlap中的自定義序列化。 而且&#xff0c;它僅由Spring提供&#xff0c;因此客戶端和服務器應…

mysql 日期列表_MySQL 生成日期表

1、創建一個num表&#xff0c;用來存儲數字0~9CREATE TABLE num (i int);2、在num表中生成0~9INSERT INTO num (i) VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9);3、生成一個存儲日期的表&#xff0c;datalist是字段名CREATE TABLE if not exists calendar(dateli…

學習后綴自動機想法

小序&#xff1a;學習后綴自動機是要有耐心的&#xff0c;clj的論文自己看真心酸爽&#xff01;&#xff08;還是自己太弱&#xff0c;ls&#xff0c;oyzx好勁啊&#xff0c;狂膜不止&#xff09; 剛剛在寫博客之前又看了篇論文&#xff0c;終于看懂了&#xff0c;好開心 正文&…

【BZOJ】3575: [Hnoi2014]道路堵塞

題目鏈接&#xff1a;http://www.lydsy.com/JudgeOnline/problem.php?id3575 大概的做法是&#xff0c;按照順序枚舉每一條要刪去的邊&#xff0c;(假設當前點為$u$&#xff0c;在最短路徑上的下一個點是$v$)然后強制不走${u->v}$這條邊&#xff0c;將$u$入隊&#xff0c;做…

結合使用slf4j和Logback教程

在當前文章中&#xff0c;我將向您展示如何配置您的應用程序以使用slf4j和logback作為記錄器解決方案。 Java簡單日志記錄外觀&#xff08;slf4j&#xff09;是各種日志記錄框架的簡單外觀&#xff0c;例如JDK日志記錄&#xff08;java.util.logging&#xff09;&#xff0c;lo…