我们一直在将我们的服务器从使用 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 也不兼容)