我们一直在将服务器从使用Hibernate 4.2转换为Hibernate 5.2。
Hibernate 5.2需要JDBC 4.2 (Java 8),这要求我们切换到Hikari CP连接池,它是我们以前使用的Bone (现在已被废弃)的一个分支,因为Bone只支持JDBC 4.1 (Java 7)。
与Bone不同的是,Hikari CP不再在连接池中提供准备好的语句缓存,因此现在需要在JDBC驱动程序中进行缓存,对于MS SQL Server来说,这意味着我们需要迁移到在驱动程序中提供准备语句缓存的JDBC驱动程序版本,而mssql 6.4.0 (2018年1月发布)是第一个这样做的版本。
从Hibernate 4.2 + Bone 0.8.0 + sqljdbc42 4.6420.100MSSQLServerJDBC驱动程序到Hibernate 5.2 + Hikari 2.7.8 +MSSQLJDBC6.4.0.jre 8。
不幸的是,由于这次切换,我们看到读查询性能平均下降了20-30% --这是不可接受的。
然而,在使用Hibernate 5.3 + Hikari +它们的JDBC驱动程序的Oracle和MySQL的相应结果中,我们实际上看到了大约5%-15%的性能改进--因此我们相当肯定这不是Hibernate (而且它不能直接是Hikari,因为一旦连接传递给我们之后就不存在了)。
因此,我们正在研究从Bone 0.8.0准备语句缓存切换到MSSQLJDBC6.4准备语句缓存的问题。
我们已经证实,如果我们将mssql 6.4驱动程序准备好的语句缓存关闭,性能会再差10%,因此它做得有点好(我们还在调试器中确认它实际上是在缓存东西)。
我们还尝试调优所有明显可用的缓存调优参数:statementPoolingCacheSize、serverPreparedStatementDiscardThreshold、enablePrepareOnFirstPreparedStatementCall (以及useCursors),但效果很小。
发布于 2018-12-01 13:07:00
不能直接回答所有这些问题--在我们的例子中,帮助提高性能的是禁用Hikari上的自动提交(在Spring 2.1中提供了相同的jdbc驱动程序版本,作为默认版本)。接下来,需要将名为‚hibernate.connection.provider_disables_autocommit‘的Hibernate选项设置为true。这允许将事务时间最小化。
请注意,7.x JDBC驱动程序是可用的--您是否注意到了相同的问题?
如果您正在使用Spring :还请记住设置,Spring.jpa.open- in -view=false‘以避免不必要的长事务(实际上是反模式)。
它不是对您的问题的直接回答,但它将有助于提高使用Mssql和Hibernate的性能。
发布于 2019-12-31 10:37:50
在野生蝇从10.0.Final到17.0.1 from的迁移过程中,我们也遇到了类似的情况。
除了长期运行的过程外,总体性能得到了改善。
在Hibernate 4.3中,缓存值为100,在迁移到Hibernate 5.3之后,该值被缩小到32,以在长时间运行的进程中实现相同的性能。
https://stackoverflow.com/questions/50652333
复制相似问题