Vì đây là một câu hỏi rất phổ biến, tôi đã viết
bài viết này , trên đó câu trả lời này dựa trên.
Cài đặt để tránh
Bạn không nên sử dụng cài đặt này:
spring.jpa.show-sql=true
Vấn đề với show-sql
là các câu lệnh SQL được in trong bàn điều khiển, vì vậy không có cách nào để lọc chúng, như bạn thường làm với khung Ghi nhật ký.
Sử dụng đăng nhập Hibernate
Trong tệp cấu hình nhật ký của bạn, nếu bạn thêm trình ghi nhật ký sau:
<logger name="org.hibernate.SQL" level="debug"/>
Sau đó, Hibernate sẽ in các câu lệnh SQL khi JDBC PreparedStatement
được tạo. Đó là lý do tại sao câu lệnh sẽ được ghi lại bằng cách sử dụng trình giữ chỗ tham số:
INSERT INTO post (title, version, id) VALUES (?, ?, ?)
Nếu bạn muốn đăng nhập các giá trị tham số liên kết, chỉ cần thêm trình ghi nhật ký sau:
<logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="trace"/>
Khi bạn đặt bộ BasicBinder
ghi, bạn sẽ thấy các giá trị tham số liên kết cũng được ghi lại:
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]
Sử dụng dataource-proxy
Các nguồn dữ liệu-proxy cho phép bạn proxy JDBC thực tế DataSource
, được minh họa bằng sơ đồ sau đây:
Bạn có thể định nghĩa dataSource
bean sẽ được Hibernate sử dụng như sau:
@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();
}
Lưu ý rằng actualDataSource
phải được DataSource
xác định bởi nhóm kết nối bạn đang sử dụng trong ứng dụng của mình.
Khi bạn kích hoạt datasource-proxy
, câu lệnh SQl sẽ được ghi lại như sau:
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