我有一个拥有相当大的实体模型的数据库。 总共有14个表,平均记录约为10万。
当我测试我的应用程序从数据库中获取一个实体并将其转换为json并将其返回给调用者时,需要7秒才能获得该条目。
这似乎不是一个初始化问题,因为如果我连续两次执行相同的调用,它们都需要大约10秒来获取数据。
当我启用sql脚本日志记录时,我发现对于每个实体读取,hibernate会向数据库发送数百个sql请求。 (实际数量取决于实体有多少连接/许可/产品/服务等,但对于我的测试条目,我收到286个查询(总共花了大约7秒)) 当数据库为空时(测试应返回的数据除外),则需要大约6秒钟。
我想问题是因为我将@ OneToMany和@ ManyToMany的提取设置为Lazy,但是当我将它们设置为渴望时,我会收到多个提取包的错误。
@javax.persistence.OneToMany(fetch = javax.persistence.FetchType.LAZY)
@org.hibernate.annotations.LazyCollection(org.hibernate.annotations.LazyCollectionOption.FALSE)
@javax.persistence.JoinColumn(name = "ProductId")
这是我所拥有的OneToMany关系的一个示例,它模拟了没有多个提取包错误的急切提取。
这是一个常见问题吗? 我如何提高阅读速度?
答案 0 :(得分:0)
Hibernate不允许有多个类型为List的标记为EAGER的集合。
最好加载数据渴望是使用JOIN FETCH
select e from YourEntity JOIN FETCH e.yourList l
另一种选择可能是使用EntityGraph定义EAGER加载。
在此处阅读有关该主题的更多信息:
https://vladmihalcea.com/hibernate-facts-the-importance-of-fetch-strategy/
如果使用Spring Data JPA存储库接口,则可以使用NamedEntityGraphs:
https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.entity-graph