mssql-jdbc MS SQL Server JDBC 驱动程序准备好的语句缓存性能问题与 Hikari CP

Posted

技术标签:

【中文标题】mssql-jdbc MS SQL Server JDBC 驱动程序准备好的语句缓存性能问题与 Hikari CP【英文标题】:mssql-jdbc MS SQL Server JDBC driver prepared statement cache performance issue with 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 也不兼容)

【问题讨论】:

【参考方案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 的性能。

【讨论】:

groups.google.com/forum/#!topic/hikari-cp/OTsKIFd3joY => 看起来像是 JDBC 驱动程序问题 7.x 修复了准备语句缓存的问题(由于使用了哈希):blogs.msdn.microsoft.com/jdbcteam/2018/07/31/…【参考方案2】:

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

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

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

【讨论】:

以上是关于mssql-jdbc MS SQL Server JDBC 驱动程序准备好的语句缓存性能问题与 Hikari CP的主要内容,如果未能解决你的问题,请参考以下文章

JDBC SSL连接SQL Server

无法从 Wildfly 连接到 SQL Server 数据库

JPQL SQL Server CURRENT_DATE 语法不正确

SOAP UI:获取响应时出错;尝试连接到 Microsoft SQL Server 时为 null

ms sql2012 能否安装在win2008 server

[MS SQL Server]SQL Server如何开启远程访问