Hibernates 在 Websphere Liberty 中的缓慢 sql 查询

Hibernates' slow sql queries in Websphere Liberty

我正在使用持久性提供程序 Hibernate 5.4 将 EAR 部署到 Websphere Liberty 21.0.0.6(我的问题在版本 5.5 中仍然存在)。数据库是 Oracle 12c。

我通过 persistence.xml (https://docs.jboss.org/hibernate/orm/5.5/javadocs/org/hibernate/cfg/AvailableSettings.html#LOG_SLOW_QUERY) 激活了 Hibernate 的 记录慢 sql 查询 的功能 该设置有效,但不幸的是,Liberty 有一个准备好的语句包装器,它没有合理的 toString() 方法。所以我日志中的输出是

org.hibernate.SQL_SLOW: SlowQuery: 3299 milliseconds. SQL: 'com.ibm.ws.rsadapter.jdbc.v42.WsJdbc42PreparedStatement@229da89'
org.hibernate.SQL_SLOW: SlowQuery: 2230 milliseconds. SQL: 'com.ibm.ws.rsadapter.jdbc.v42.WsJdbc42PreparedStatement@90069551'

等等。这对确定哪些查询很慢没有太大帮助......似乎 Hibernate 只是在准备好的语句上做了一个 toString() 。查看 org.hibernate.engine.jdbc.spi.SqlStatementLogger#logSlowQuery(Statement, long).

的来源

是的,您应该为此打开一个针对 Hibernate 的错误。 PreparedStatement.toString 将显示 SQL 的断言是不正确的,因为 JDBC 规范或 PreparedStatement JavaDoc 中没有要求保证甚至推荐该行为。您看到的 toString 输出非常标准,遵循完全限定 class 名称 @ 十六进制哈希码的 java.lang.Object.toString 约定。

WebSphere Application Server Liberty 确实有一些选项可以帮助您查看 SQL 查询和其他 JDBC 操作。请参阅以下有关启用 JDBC 驱动程序跟踪的部分,该部分根据您使用的 database/JDBC 驱动程序进行详细说明:

https://www.ibm.com/docs/en/was-liberty/nd?topic=liberty-enabling-jdbc-tracing