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

我们一直在将服务器从使用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%,所以它做得有点好(我们也在调试器中确认它实际上是在缓存内容).

我们还尝试为它调整所有明显可用的缓存调整参数:statementPoolingCacheSize,serverPreparedStatementDiscardThreshold,enablePrepareOnFirstPreparedStatementCall(以及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不兼容)

最佳答案
无法直接回答所有这些问题 – 在我们的案例中有助于提高性能(相同的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提高性能.

转载注明原文:hibernate – mssql-jdbc MS SQL Server JDBC驱动程序准备了与Hikari CP的语句缓存性能问题 - 代码日志