4

我们一直在将我们的服务器从使用 Hibernate 4.2 转换为 Hibernate 5.2。

Hibernate 5.2 需要 JDBC 4.2 (Java 8),这需要我们切换到 Hikari CP 连接池,它是我们之前使用的(现已弃用)Bone CP 的一个分支,因为 Bone CP 仅支持 JDBC 4.1 (Java 7) .

与 Bone CP 不同,Hikari CP 不再在连接池中提供准备好的语句缓存,因此现在需要在 JDBC 驱动程序中完成,这对于 MS SQL Server 意味着我们需要迁移到提供准备好的语句缓存的 JDBC 驱动程序版本驱动程序,mssql-jdbc 6.4.0(2018 年 1 月发布)是第一个使用它的驱动程序。

所以完整的变化是从 Hibernate 4.2 + Bone CP 0.8.0 + sqljdbc42 4.2.6420.100 MS SQL Server JDBC 驱动程序到 Hibernate 5.2 + Hikari CP 2.7.8 + mssql-jdbc 6.4.0.jre8。

不幸的是,由于这种切换,我们看到读取查询性能平均下降了 20-30%——这是不可接受的。

然而,在 Oracle 和 MySQL 与 Hibernate 5.3 + Hikari + 他们的 JDBC 驱动程序的相应结果中,我们实际上看到了大约 5-15% 的性能改进——所以我们有理由确定这不是由于 Hibernate(而且它不能直接成为 Hikari,因为一旦将连接交给我们,那就不存在了)。

因此,我们正在调查从 Bone CP 0.8.0 准备语句缓存到 mssql-jdbc 6.4 准备语句缓存的切换问题。

我们已经确认,如果我们关闭 mssql-jdbc 6.4 驱动程序准备好的语句缓存,性能会再降低 10%,所以它的性能有点好(我们还在调试器中确认它实际上是在缓存东西)。

我们还尝试为它调整所有明显可用的缓存调整参数:statementPoolingCacheSizeserverPreparedStatementDiscardThresholdenablePrepareOnFirstPreparedStatementCall(以及useCursors),但效果很小。

  • 有没有人对 Hikari CP + mssql-jdbc 6.4 或 Hibernate 5 + Hikari CP + mssql-jdbc 6.4 的组合有任何经验?
  • 来自 mssql-jdbc 6.4 的准备好的语句缓存性能差(与 Bone CP 过去提供的相比)是一个已知问题吗?还是 mssql-jdbc 对于读取查询的总体速度比 sqljdbc42 慢?
  • 是否还有其他我们遗漏的 mssql-jdbc 调优参数?任何人都可以建议我们可以尝试的其他任何东西——例如,是否有另一个我们可以尝试的 MS SQL Server JDBC 驱动程序?(jDTS 不是一个选项,因为它甚至与 JDBC 4.0 也不兼容)
4

2 回答 2

0

在从 Wildfly 10.0.0.Final 迁移到 17.0.1.Final 的过程中,我们也遇到了类似的情况。

整体性能得到了改善,除了长时间运行的进程。

在 Hibernate 4.3 中,缓存值为 100,在迁移到 Hibernate 5.3 后,该值被缩小到 32,以在长时间运行的进程中实现相同的性能。

于 2019-12-31T10:37:50.880 回答
0

无法直接回答所有这些问题 - 在我们的案例中帮助提高性能(相同的 jdbc 驱动程序版本,在 Spring Boot 2.1 中作为默认提供)是禁用 Hikari 上的自动提交。接下来,您需要将名为“hibernate.connection.provider_disables_autocommit”的 Hibernate 选项设置为 true。这允许最小化交易时间。

请注意,可以使用 7.x JDBC 驱动程序 - 您能否检查您是否注意到相同的问题?

如果您使用 Spring Boot:还要记住设置“spring.jpa.open-in-view=false”以避免不必要的长事务(实际上是反模式)。

这不是您问题的直接答案,但它有助于提高使用 Mssql 和 Hibernate 的性能。

于 2018-12-01T13:07:00.773 回答