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 或liberty 来输出真实的SQL?我必须实现自己的语句包装器吗?
- 我应该在休眠中打开一个错误吗?
是的,您应该为此打开一个针对 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
我正在使用持久性提供程序 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 或liberty 来输出真实的SQL?我必须实现自己的语句包装器吗?
- 我应该在休眠中打开一个错误吗?
是的,您应该为此打开一个针对 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