P6Spy — มา log SQL จาก JPA กัน

tumit
odds.team
Published in
2 min readFeb 4, 2022

เวลาเราใช้ Spring Data ปัญหาที่เราจะเจอกันบ่อย ๆ คือ พอมีปัญหาอยาก debug เราอยากรู้ว่า ไอ้ JPQL หรือ query ที่มาจาก Method name strategy จริงแล้วมัน run SQL command อะไรกันแน่ ทำไงดี

* ข้อควรระวัง

ถ้าเป็นไปได้ควรใช้แค่ none-prod environment เท่านั้น หรือถ้าจะใช้ใน prod ให้ระวังเพิ่มอีกนิดเพราะอาจจะมีปัญหาเรื่อง sensitive information ใน log ได้

ท่าปกติ : spring.jpa.show-sql=true

ในที่นี้เราใช้ Spring Boot (เป็นท่ามาตราฐานของ Java ไปแล้วมั้ง) สมมุติว่าเรามี code ไว้สำหรับ CRUD ข้อมูลใน DB หน้าตาประมาณนี้

Test ~
Repository
Enti

ถ้าเราอยากจะ debug SQL command ก็สามารถ enable ของ show-sql ใน application.properties ได้ประมาณนี้

# enable show-sql
spring.jpa.show-sql=true

เราก็จะได้ log หน้าตาประมาณนี้

Hibernate: select memberenti0_.member_id as member_i1_0_0_, memberenti0_.member_name as member_n2_0_0_ from member memberenti0_ where memberenti0_.member_id=?

แต่ชีวิตมันไม่ง่ายเหมือนบะหมี่กึ่งสำเร็จรูป ข้อเสียของ option นี้คือมันแค่ log ที่เป็น query command เท่านั้น เช่นในตัวอย่างจะได้แค่

where memberenti0_.member_id=?

ในส่วนของ params ต้องไปนั่งไล่ใส่เองซึ่งในการ debug มันก็ยังไม่ง่ายเท่าไหร่นัก เราเลยมีตัวช่วยคือ p6spy นั้นเองงงง

ท่าเพิ่มเติม: p6spy

เป็น lib ที่ทำตัวเหมือน proxy ช่วยในการเพิ่ม params เข้าไปใน log ให้เราสามารถเอาไป debug ได้ง่ายขึ้น โดยเฉพาะตัวอย่างนี้ที่เป็น Spring Boot เราสามารถเพิ่ม dependencies

implementation ‘com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.8.0’

แล้ว config application.properties เพิ่มอีกนิด เพราะค่า default log ของ p6spy ให้มาเกินความต้องการไปนิด ๆ (log format อื่น ๆ ไปตามดูได้ในอ้างอิงเด้อ ~)

# p6spy config
decorator.datasource.p6spy.log-format=%(category): %(sql)

เราก็จะได้ log หน้าตาประมาณนี้

Hibernate: select memberenti0_.member_id as member_i1_0_0_, memberenti0_.member_name as member_n2_0_0_ from member memberenti0_ where memberenti0_.member_id=?
2022–02–04 09:10:56 INFO p6spy.logSQL:60 — statement: select memberenti0_.member_id as member_i1_0_0_, memberenti0_.member_name as member_n2_0_0_ from member memberenti0_ where memberenti0_.member_id=999
2022–02–04 09:10:56 INFO p6spy.logSQL:60 — commit:

เราก็จะได้ log SQL ที่มี param มา เอาไว้ไป debug ได้อย่างสวยงามมมมม

where memberenti0_.member_id=999

อ้างอิง

- https://github.com/gavlyukovskiy/spring-boot-data-source-decorator
- https://p6spy.readthedocs.io/en/latest/configandusage.html

--

--