Java hibernate在大量查询后停止响应 @实体 公共班级登记册{ @身份证 @列(nullable=false,unique=true,Updateable=false) 私有长用户ID; 检查私人日期; @列(nullable=false) 私人注册类型tipo; @ElementCollection(fetch=FetchType.LAZY,targetClass=String.class) @列(name=“relatedMedia”) @级联(值={org.hibernate.annotations.CascadeType.ALL}) @Fetch(FetchMode.SUBSELECT) @批量大小(大小=200) 私有列表相关媒体=新向量(5); private boolean preLiked=false; 私有布尔预编码=false; @OneToMany(cascade=CascadeType.ALL,fetch=FetchType.LAZY,orphanRemoving=false,mappedBy=“toUser”) @订购人(“quando DESC”) @Fetch(FetchMode.SELECT) 私有列表消息=新向量(50); }

Java hibernate在大量查询后停止响应 @实体 公共班级登记册{ @身份证 @列(nullable=false,unique=true,Updateable=false) 私有长用户ID; 检查私人日期; @列(nullable=false) 私人注册类型tipo; @ElementCollection(fetch=FetchType.LAZY,targetClass=String.class) @列(name=“relatedMedia”) @级联(值={org.hibernate.annotations.CascadeType.ALL}) @Fetch(FetchMode.SUBSELECT) @批量大小(大小=200) 私有列表相关媒体=新向量(5); private boolean preLiked=false; 私有布尔预编码=false; @OneToMany(cascade=CascadeType.ALL,fetch=FetchType.LAZY,orphanRemoving=false,mappedBy=“toUser”) @订购人(“quando DESC”) @Fetch(FetchMode.SELECT) 私有列表消息=新向量(50); },java,mysql,hibernate,jpa,Java,Mysql,Hibernate,Jpa,我的系统中的这个实体有问题。实际上,数据库有150万个已保存的寄存器,所有寄存器都有0条消息和0个相关媒体(但要确保问题不在它们身上) 当我尝试从数据库加载所有Register.userId时,查询运行良好且非常快 当我尝试从数据库加载所有寄存器时,hibernate停止响应。 在mysql控制台中运行查询表示查询在几毫秒内返回。。。但是在hibernate中,程序简单地陷入了框架的一些内部代码中。没有异常,没有返回,不再响应 考虑到我的实体相当小,它的主键加上2个布尔值,一个int[tipo]

我的系统中的这个实体有问题。实际上,数据库有150万个已保存的寄存器,所有寄存器都有0条消息和0个相关媒体(但要确保问题不在它们身上)

当我尝试从数据库加载所有Register.userId时,查询运行良好且非常快

当我尝试从数据库加载所有寄存器时,hibernate停止响应。 在mysql控制台中运行查询表示查询在几毫秒内返回。。。但是在hibernate中,程序简单地陷入了框架的一些内部代码中。没有异常,没有返回,不再响应

考虑到我的实体相当小,它的主键加上2个布尔值,一个int[tipo]和一个date。。。仅加载主键和所有5个字段之间的差异应该不会太长

有人知道问题出在哪里吗?这有什么限制吗?是堆限制吗?但是如果是堆限制,为什么不让堆栈溢出呢

=================================================================== 尽管没有抛出异常,但我对堆大小有很大的怀疑,所以我只是调整了jvm上的堆值,查询在不到10秒内完成


问题是为什么从未抛出异常?它是一个runtimeexception,所以应该直接从jvm中抛出。。。hibernate是否在循环中有捕获(异常e)功能?

启用SQL调试日志并查看hibernate可能在做什么?我对指定
SUBSELECT
是原因感到好奇。您是否尝试过
SELECT
对集合使用默认获取模式策略以查看是否返回?我使用SUBSELECT是因为我更喜欢一个大查询而不是数千个小查询。。。但正如我所说的,relatedMedia表和Messages表中都并没有实体,这两个表都是惰性的hibernate,所以它们甚至尝试获取它们。
@Entity
public class Register {

    @Id
    @Column(nullable = false, unique = true, updatable = false)
    private Long userId;

    private Date checked;

    @Column(nullable = false)
    private RegisterType tipo;

    @ElementCollection(fetch = FetchType.LAZY, targetClass = String.class)
    @Column(name = "relatedMedia")
    @Cascade(value = { org.hibernate.annotations.CascadeType.ALL })
    @Fetch(FetchMode.SUBSELECT)
    @BatchSize(size = 200)
    private List<String> relatedMedia = new Vector<String>(5);

    private boolean preLiked = false;
    private boolean preCommented = false;

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = false, mappedBy = "toUser")
    @OrderBy("quando DESC")
    @Fetch(FetchMode.SELECT)
    private List<Message> messages = new Vector<Message>(50);
}