【问题标题】:mssql-jdbc MS SQL Server JDBC driver prepared statement cache performance issue with Hikari CPmssql-jdbc MS SQL Server JDBC 驱动程序准备好的语句缓存性能问题与 Hikari CP
【发布时间】:2018-11-12 02:55:06
【问题描述】:

我们一直在将我们的服务器从使用 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%,这是不可接受的。

但是,在使用 Hibernate 5.3 + Hikari + 他们的 JDBC 驱动程序的 Oracle 和 MySQL 的相应结果中,我们实际上看到了大约 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 也不兼容)

【问题讨论】:

    标签: hibernate hikaricp mssql-jdbc bonecp sqljdbc


    【解决方案1】:

    无法直接回答所有这些问题 - 在我们的案例中(相同的 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 的性能。

    【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-03
      • 1970-01-01
      • 2014-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多