Karena ini adalah pertanyaan yang sangat umum, saya menulis
artikel ini , yang menjadi dasar jawaban ini.
Pengaturan yang harus dihindari
Anda seharusnya tidak menggunakan pengaturan ini:
spring.jpa.show-sql=true
Masalahnya show-sql
adalah bahwa pernyataan SQL dicetak di konsol, jadi tidak ada cara untuk memfilternya, seperti yang biasanya Anda lakukan dengan kerangka Logging.
Menggunakan Hibernate logging
Di file konfigurasi log Anda, jika Anda menambahkan logger berikut:
<logger name="org.hibernate.SQL" level="debug"/>
Kemudian, Hibernate akan mencetak pernyataan SQL ketika JDBC PreparedStatement
dibuat. Itu sebabnya pernyataan akan dicatat menggunakan penampung parameter:
INSERT INTO post (title, version, id) VALUES (?, ?, ?)
Jika Anda ingin mencatat nilai parameter bind, tambahkan juga logger berikut:
<logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="trace"/>
Setelah Anda mengatur BasicBinder
logger, Anda akan melihat bahwa nilai parameter bind juga dicatat:
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]
Menggunakan sumber data-proxy
Data -proxy-proksi memungkinkan Anda untuk mem-proxy JDBC yang sebenarnya DataSource
, seperti yang diilustrasikan oleh diagram berikut:
Anda bisa mendefinisikan dataSource
kacang yang akan digunakan oleh Hibernate sebagai berikut:
@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();
}
Perhatikan bahwa actualDataSource
harus DataSource
ditentukan oleh kumpulan koneksi yang Anda gunakan dalam aplikasi Anda.
Setelah Anda mengaktifkan datasource-proxy
, pernyataan SQl akan dicatat sebagai berikut:
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