Java Hibernate 复杂实体关联下,简单查询都很慢,如何优化?

324 天前
 XiaoJiang9527

最近正在整改一个老项目,里面的表结构错综复杂,实体中的映射表字段基本都增加了 @ManyToOne 和 @JoinColumn 注解,导致很多简单单表查询都需要执行很久。 但是打印具体 hibernate SQL 日志,Explain 下,也不存在什么性能问题,各位大佬们,怎么解?

5726 次点击
所在节点    程序员
65 条回复
XiaoJiang9527
324 天前
@Sanshi4396 嗯,值得试一下
ZSeptember
324 天前
SQL 优化空间不大吧,主要是使用姿势。
什么复杂业务 ORM 用的这么花,互联网不是不让 join 吗
yor1g
324 天前
@XiaoJiang9527 可以按需的 开了延迟加载可以基本解决 n+1 问题 再优化的话要按需返回字段 + 基础表开 2 级缓存
XiaoJiang9527
324 天前
@ZSeptember 互联网不让用,奈何 hibernate 机制在哪里,数据少和初期开发的时候压根不会考虑,后期优化头都大
issakchill
324 天前
@XiaoJiang9527 #4 简单试试加个 @Lazy
XiaoJiang9527
324 天前
@ZSeptember 只能提取业务结果,将 SQL 尽可能压缩,取按需内容。
XiaoJiang9527
324 天前
@issakchill 最开始就是尝试过,改了之后一大堆空指针异常,改了 5 个后,放弃了这个方案。
XiaoJiang9527
324 天前
@yor1g 我来试试 i
Goooooos
324 天前
我技术水平不够,还是喜欢用 mybatis ,这样自己好把控细节

建议 @ 一下 v2 上常常出来 diss mybatis 的 hibernate 大神来帮你优化
xuanbg
324 天前
性能问题唯有手写 sql 可解。
UBcai
324 天前
勾起了我吐槽欲望。项目最开始架构要 Hibernate ,我说不行。我只要 a 表的 1,2,3 字段,hibernate 会查询全部字段,并且会查询 a 表的关联表 b 的字段,逻辑复杂后肯定有性能问题。架构说小公司,性能要不了那么高要求。说白了就是 hibernate 不用写 sql,当时他还没决定入职,怎么简单怎么来。老板还让我多和架构学学,不要还没学会走就想跑。后面果然不出我所料,出了各种大问题。你们敢想象 30 个人同时用,服务器直接崩了。
zhazi
324 天前
/*
* Copyright (c) 2008, 2019 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0,
* or the Eclipse Distribution License v. 1.0 which is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
*/

// Contributors:
// Linda DeMichiel - 2.1
// Linda DeMichiel - 2.0


package javax.persistence;

/**
* Defines strategies for fetching data from the database.
* The <code>EAGER</code> strategy is a requirement on the persistence
* provider runtime that data must be eagerly fetched. The
* <code>LAZY</code> strategy is a hint to the persistence provider
* runtime that data should be fetched lazily when it is
* first accessed. The implementation is permitted to eagerly
* fetch data for which the <code>LAZY</code> strategy hint has been
* specified.
*
* <pre>
* Example:
* &#064;Basic(fetch=LAZY)
* protected String getName() { return name; }
* </pre>
*
* @see Basic
* @see ElementCollection
* @see ManyToMany
* @see OneToMany
* @see ManyToOne
* @see OneToOne
* @since 1.0
*/
public enum FetchType {

/** Defines that data can be lazily fetched. */
LAZY,

/** Defines that data must be eagerly fetched. */
EAGER
}

不看文档,不查手册的吐槽我不是很认可
XiaoJiang9527
324 天前
@Goooooos 哈哈,又臭有长的代码,没有那个大佬看得下去叭
aragakiyuii
324 天前
@UBcai projection query
XiaoJiang9527
324 天前
@UBcai 目前我这个更是离谱,不过都是同一种类型的问题,先归结为机制问题吧
XiaoJiang9527
324 天前
@zhazi 这个机制调整会导致我后续业务代码空指针,而且很多。 /狗头
zhazi
324 天前
@XiaoJiang9527 晒代码,别虚空打靶
Nosub
324 天前
了解一下,EntityGraph
Nosub
324 天前
@UBcai 投影 Projections 和 DTO 了解一下,如果遇到问题只会吐槽,肯定还是无法掌握 Hibernate 的。
Nosub
324 天前
还有个问题,很多人没有搞清楚 JPA ,Hibernate 和 Spring Data JPA 的关系,建议花点时间搞清楚这些概念,OP 说的是 Spring Data JPA 速度慢。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1013581

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX