gpt4 book ai didi

java - 自定义 hibernate 实体持久性

转载 作者:搜寻专家 更新时间:2023-10-30 19:51:18 24 4
gpt4 key购买 nike

我正在对映射的项目进行性能测试/优化

a document <--> Java object tree <--> mysql database

用于映射的文档、Java 类、数据库模式和逻辑是使用 HyperJaxb3 编排的。它的 ORM 部分是 hibernate 提供的 JPA。

大约有 50 个不同的实体,它们之间显然有很多关系。该应用程序的一个主要功能是加载文档,然后将数据重新组织到新文档中;每个传入文档的所有部分最终都会在一个传出文档中发送出去。虽然我不希望生活在关系世界中,但事务语义非常适合此应用程序 - 涉及大量资金和政府监管,因此我们需要确保所有内容都恰好一次交付。

在功能上,一切进展顺利,性能也不错(经过大量调整后)。每个文档由几千个实体组成,最终在数据库中创建几千行。文档的大小各不相同,插入性能几乎与需要插入的行数成正比(这不足为奇)。

我看到了重大优化的潜力,这就是我的问题所在。

每个文档都映射到一个实体树。树的“叶子”部分包含许多详细信息,这些信息未用于决定如何生成传出文档。换句话说,我不需要能够根据许多表的内容进行查询/过滤。

我想将适当的实体子树映射到 blob,从而节省插入/更新/索引我当前以通常方式处理的大部分行的开销。

看来我最好的选择是实现自定义 EntityPersister 并将其与适当的实体相关联。这是正确的方法吗? hibernate 文档还不错,但它是一个相当复杂的类,需要实现,在查看 javadoc 后我留下了很多问题。你能给我指出一个具体而简单的例子,我可以用它作为起点吗?

对实现此优化的另一种方法有任何想法吗?

最佳答案

我在存储大量二进制数据时遇到了同样的问题。我发现效果最好的解决方案是对象模型的非规范化。例如,我创建了一个主记录,然后我创建了另一个保存二进制数据的对象。在 master 上,使用 @OneToOne 映射到次要对象,但将关联标记为惰性。现在数据只会在您需要时加载。

可能会减慢您速度的一件事是 hibernate 对所有此类对象执行的 outer join。为避免这种情况,您可以将对象标记为强制性的。但是如果数据库不会给你带来巨大的性能损失,我建议你不要管它。我发现如果我尝试进行常规连接,Hibernate 倾向于立即加载二进制数据。

最后,如果您需要在单个 SQL 调用中检索大量二进制数据,请使用 HQL fetch join 命令。例如:from Article a fetch join a.data 其中 a.data 是与二进制持有者的一对一关系。 HQL 编译器会将此视为在单个 sql 调用中获取所有数据的指令。

HTH

关于java - 自定义 hibernate 实体持久性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14390515/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com