我们不应该对大型数据库使用休眠吗?



最近我开始学习Hibernate,在浏览时我遇到了这个网站:Hibernate与JDBC

该链接说有2张桌子 - UserContract每个用户都有3份合同。User中的记录数为 100,000 ,表中Contract记录数为 300,000

现在,该链接给出了示例,说明当我们拥有数十万条记录时,它如何影响性能。

我在机器上运行代码,普通的JDBC代码只需486 ms就可以通过连接两个表来获取UserContract详细信息。

现在,如果我们使用Hibernate进行相同的操作,则需要花费大量时间,如下所示:

// Using Fetch mode as **@Fetch(FetchMode.SUBSELECT)**
test1 : 11
// Using Fetch mode as **@Fetch(FetchMode.SELECT)**
test2 : 50
// Using Fetch mode as **@Fetch(FetchMode.JOIN)**
test3 : 45
// Using HQL query using **join fetch** option
test4 : 7
// Using Hibernate native SQL query
test4 : 3

这里的数字以秒为单位给出。

那么这是否意味着Hibernate只对小项目有用?

如果我的数据库有几十万条左右的记录,我们应该使用普通的 JDBC?我认为拥有此范围的记录对于许多应用程序来说很常见,那么在这种情况下开发人员如何使用休眠呢?

眠不会优化性能。没有魔法。它(充其量)可以像原始JDBC一样快。每次有人抱怨它时,我都会提醒他们调整。一切都需要调整。甚至数据库本身:索引和分区。开箱即用的性能(所有内容都默认)仅适用于 POC。

Hibernate

所做的,顺便说一句,你应该使用标准的JPA,而不是直接使用Hibernate,它可以让你免于编写乏味的映射和其他容易变成意大利面条混乱的管道代码。这些可维护性问题会比任何性能问题更快地杀死您的项目。

优化休眠包括适当的惰性与预先连接等,避免了 N+1 Select 问题,以及索引和分区。您应该 100% 清楚地了解它如何将查询转换为原始 SQL。当你看到你不喜欢的东西时,调整它。

现在,如果你有大型数据集:数十亿和数万亿条某些遥测或统计数据的记录,你应该查看列存储NoSQL数据库,也就是大表。目前Cassandra是最快的。它基本上是一个巨大的分布式索引。

好吧,您的表可能包含数十万个条目,但是批处理(当您加载这么多条目时正在这样做)可能最好使用 JDBC 完成,或者至少不要在不考虑加载那么多条目的情况下加载所有条目。

另请参阅:JPA:迭代大型结果集的正确模式是什么?

最新更新