如何调整调试日志记录级别语句以提高性能?我之所以这么问,是因为我的 spring 批处理作业可以在每个作业中调用大约 50 个 logger.debug 语句(或多或少相同)几百万次。
查询:
private final String updateIsUserFl = "update users "
+ "set flag = 'Y' "
+ "where name = ? and id = ? ";
查询执行:
myJdbcTemplate.update(updateIsUserFl, name, id);
记录语句:
String debugQuery = updateIsUserFl.toString();
logger.debug(replace(debugQuery, "?", name, 1));
logger.debug(replace(debugQuery, "?", Integer.toString(id), 1));
具体问题:
所以,基本上,我想打印出传递到 JdbcTemplate 的确切查询。有没有比 StringUtils.replace 更好/成本更低的方法?希望也不要那么严厉(为了可维护性)。
在 updateUserFl 上调用 toString 是复制最终字符串对象以进行字符串操作的正确/有效方法吗?
是否会将其包装在 if logger.IsDebugEnabled 检查帮助中,或者 slf4j 是否已为我执行此操作?
我可以使用 logback/{}(以某种我想不到的方式)来提供帮助吗?
log4j2、Java 8 (lambdas) 是我应该考虑的选项吗?请参阅:Avoid Log4j/Slf4j debug enabled checks
最佳答案
这将与 org.springframework.jdbc-3.0.6.RELEASE.jar 一起使用。 TRACE 级别即可完成任务。
我使用 log4j-1.2.15 以及 slf4j (1.6.4) 和属性文件来配置 log4j:
log4j.logger.org.springframework.jdbc.core = TRACE
这会显示 SQL 语句和绑定(bind)参数,如下所示:
Executing prepared SQL statement [select HEADLINE_TEXT, NEWS_DATE_TIME from MY_TABLE where PRODUCT_KEY = ? and NEWS_DATE_TIME between ? and ? order by NEWS_DATE_TIME]
Setting SQL statement parameter value: column index 1, parameter value [aaa], value class [java.lang.String], SQL type unknown
Setting SQL statement parameter value: column index 2, parameter value [Thu Oct 11 08:00:00 CEST 2012], value class [java.util.Date], SQL type unknown
Setting SQL statement parameter value: column index 3, parameter value [Thu Oct 11 08:00:10 CEST 2012], value class [java.util.Date], SQL type unknown
SQL类型我们在这里可以忽略
对于仅 SQL(即,如果您对绑定(bind)参数值不感兴趣)DEBUG
应该足够了。
关于java - 调试级别记录语句性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39177313/