Hibernate mssql jdbc MS SQL Server jdbc驱动程序准备语句缓存性能问题与Hikari CP
我们一直在将服务器从使用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%,所以它做得有点好(我们还在调试器中确认它实际上在缓存东西) 我们还尝试为它调整所有明显可用的缓存优化参数: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意味着我们需要转向在驱动程序中提供预处理语句缓存的
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语句缓存的问题(由于使用了哈希):