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

Hibernate mssql jdbc MS SQL Server jdbc驱动程序准备语句缓存性能问题与Hikari CP,hibernate,hikaricp,mssql-jdbc,bonecp,sqljdbc,Hibernate,Hikaricp,Mssql Jdbc,Bonecp,Sqljdbc,我们一直在将服务器从使用Hibernate4.2转换为Hibernate5.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意味着我们需要转向在驱动程序中提供预处理语句缓存的

我们一直在将服务器从使用Hibernate4.2转换为Hibernate5.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%,所以它做得有点好(我们还在调试器中确认它实际上在缓存东西)

我们还尝试为它调整所有明显可用的缓存优化参数:
statementPoolingCacheSize
serverpreparedstatementdeaddershold
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不是一个选项,因为它甚至与JDBC4.0都不兼容)

    • 无法直接回答所有这些问题-在我们的案例中,帮助提高性能的是禁用Hikari上的自动提交功能(与Spring Boot 2.1中默认提供的jdbc驱动程序版本相同)。 接下来,您需要将名为“Hibernate.connection.provider\u disables\u autocommit”的休眠选项设置为true。 这样可以最大限度地减少事务时间

      请注意,7.xJDBC驱动程序是可用的-您能检查一下是否注意到同样的问题吗

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


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

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

      除长时间运行的进程外,总体性能有所提高


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

      =>看起来像JDBC驱动程序issue7.x修复了preparement语句缓存的问题(由于使用了哈希):