要避免的设置
你不应该使用这个设置:
spring.jpa.show-sql=true
show-sql 的问题在于 SQL 语句是在控制台中打印的,因此无法像通常使用 Logging 框架那样过滤它们。
使用 Hibernate 日志记录
在您的日志配置文件中,如果您添加以下记录器:
<logger name="org.hibernate.SQL" level="debug"/>
然后,Hibernate 将在创建 JDBC PreparedStatement 时打印 SQL 语句。这就是为什么将使用参数占位符记录语句的原因:
INSERT INTO post (title, version, id) VALUES (?, ?, ?)
如果要记录绑定参数值,只需添加以下记录器即可:
<logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="trace"/>
设置BasicBinder 记录器后,您将看到绑定参数值也被记录:
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]
使用数据源代理
datasource-proxy OSS 框架允许您代理实际的 JDBC DataSource,如下图所示:
您可以按如下方式定义 Hibernate 将使用的 dataSource bean:
@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 必须是您在应用程序中使用的[连接池][2] 定义的DataSource。
接下来,您需要在日志框架配置文件中将net.ttddyy.dsproxy.listener 日志级别设置为debug。例如,如果您使用 Logback,则可以添加以下记录器:
<logger name="net.ttddyy.dsproxy.listener" level="debug"/>
启用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)]