【发布时间】:2018-11-12 02:55:06
【问题描述】:
我们一直在将我们的服务器从使用 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%,这是不可接受的。
但是,在使用 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、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 也不兼容)
【问题讨论】:
标签: hibernate hikaricp mssql-jdbc bonecp sqljdbc