เนื่องจากนี่เป็นคำถามที่พบบ่อยมากฉันจึงเขียน
บทความนี้ขึ้นอยู่กับคำตอบนี้
การตั้งค่าที่ควรหลีกเลี่ยง
คุณไม่ควรใช้การตั้งค่านี้:
spring.jpa.show-sql=true
ปัญหาshow-sql
คือว่าคำสั่ง SQL จะถูกพิมพ์ในคอนโซลจึงไม่มีวิธีการกรองพวกเขาตามปกติคุณจะทำกับกรอบการเข้าสู่ระบบ
การใช้การบันทึกการไฮเบอร์เนต
ในไฟล์กำหนดค่าบันทึกถ้าคุณเพิ่มตัวบันทึกต่อไปนี้:
<logger name="org.hibernate.SQL" level="debug"/>
จากนั้น Hibernate จะพิมพ์คำสั่ง SQL เมื่อ JDBC PreparedStatement
จะถูกสร้างขึ้น นั่นเป็นเหตุผลที่คำสั่งจะถูกบันทึกโดยใช้พารามิเตอร์ตัวยึด:
INSERT INTO post (title, version, id) VALUES (?, ?, ?)
หากคุณต้องการบันทึกค่าพารามิเตอร์ bind เพียงเพิ่มตัวบันทึกต่อไปนี้ด้วย:
<logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="trace"/>
เมื่อคุณตั้งค่าตัวBasicBinder
บันทึกคุณจะเห็นว่าค่าพารามิเตอร์ bind ถูกบันทึกเช่นกัน:
DEBUG [main]: o.h.SQL - insert into post (title, version, id) values (?, ?, ?)
TRACE [main]: o.h.t.d.s.BasicBinder - binding parameter [1] as [VARCHAR] - [High-Performance Java Persistence, part 1]
TRACE [main]: o.h.t.d.s.BasicBinder - binding parameter [2] as [INTEGER] - [0]
TRACE [main]: o.h.t.d.s.BasicBinder - binding parameter [3] as [BIGINT] - [1]
การใช้แหล่งข้อมูลพร็อกซี่
แหล่งข้อมูล-พร็อกซี่ช่วยให้คุณพร็อกซี่ที่เกิดขึ้นจริง JDBC DataSource
, แสดงตามแผนภาพต่อไปนี้:
คุณสามารถกำหนดdataSource
bean ที่จะใช้โดย Hibernate ดังนี้:
@Bean
public DataSource dataSource(DataSource actualDataSource) {
SLF4JQueryLoggingListener loggingListener = new SLF4JQueryLoggingListener();
loggingListener.setQueryLogEntryCreator(new InlineQueryLogEntryCreator());
return ProxyDataSourceBuilder
.create(actualDataSource)
.name(DATA_SOURCE_PROXY_NAME)
.listener(loggingListener)
.build();
}
ขอให้สังเกตว่าactualDataSource
จะต้องมีการDataSource
กำหนดโดยกลุ่มการเชื่อมต่อที่คุณใช้ในใบสมัครของคุณ
เมื่อคุณเปิดใช้datasource-proxy
งานคำสั่ง SQl จะถูกบันทึกไว้ดังนี้:
Name:DATA_SOURCE_PROXY, Time:6, Success:True,
Type:Prepared, Batch:True, QuerySize:1, BatchSize:3,
Query:["insert into post (title, version, id) values (?, ?, ?)"],
Params:[(Post no. 0, 0, 0), (Post no. 1, 0, 1), (Post no. 2, 0, 2)]
logging.level.org.hibernate.type=TRACE