存储';大型';数据,用Java中的列表表示,在数据库中?
在数据库中存储由Java列表表示的“大型”数据的最佳实践是什么 我正在考虑3种变体:存储';大型';数据,用Java中的列表表示,在数据库中?,java,jpa,jta,Java,Jpa,Jta,在数据库中存储由Java列表表示的“大型”数据的最佳实践是什么 我正在考虑3种变体: 使用“@OneToMany”将数据存储在单独的表中 序列化数据并将其存储在父表中 将数据存储为文件(命名约定?与id相同?) 更具体地说 “大型”数据实体: class SingleSleeper{ private Double startPositionOnLeft; private Double endPositionOnLeft; private Double startPosi
class SingleSleeper{
private Double startPositionOnLeft;
private Double endPositionOnLeft;
private Double startPositionOnRight;
private Double endPositionOnRight;
....
}
class RutEntry{
private Double width;
private Double position;
...
}
在一个父实例中,大约有50个SingleSleeper
类实例和25000个RutEntry
类实例。父实例每天生成大约40次。
我用的是EclipselinkJPA2.1,德比
加成
最重要的是,我对Java的最佳可读性感兴趣。但我担心,若我将太多的数据存储到数据库中,那个么数据库速度会显著降低。绝大多数请求将选择特定父实体的SingleSleeper或RutEntry类的所有实例。我对支持不同的数据库类型不感兴趣,但如果需要,我可以转移到其他数据库。我想我不会使用这两种变体 我想在子实体中添加一个
manytone
(与您的第一个变体相反):
这可以确保您有一个映射,并且如果您不需要父对象的25000个实体,您永远不会加载它们(延迟获取确保您甚至不需要加载父实体)
如果确实需要,可以使用mappedBy
链接在父对象中创建OneToMany
。例如,因为您始终需要父实体中的所有子对象:
class ParentEntity {
@OneToMany(mappedBy = "parent", fetch = FetchType.LAZY)
Collection<SingleSleeper> singleSleepers;
@OneToMany(mappedBy = "parent", fetch = FetchType.LAZY)
Collection<RutEntry> rutEntries;
}
这种方法有三个优点:
Query.setFirstResult
和Query.setMaxResults
修改createQuery
的结果)这是一个非常模糊的问题:您是否对存储时的最佳性能、选择时的最佳性能(针对特定查询?)、最佳存储大小、Java中的最佳可读性、对不同数据库类型的最佳支持感兴趣(您还考虑了哪些其他数据库类型?)。我唯一能说的是:如果您有许多子实体,请在子实体上使用
manytone
,而不是在父实体上使用OneToMany
。@Tobias最重要的是,我对Java的最佳可读性感兴趣。但我担心,若我将太多的数据存储到数据库中,那个么数据库速度会显著降低。绝大多数请求将选择特定父实体的SingleSleeper或RutEntry类的所有实例。我对支持不同的数据库类型不感兴趣,但如果需要,我可以转移到其他数据库。谢谢,但是速度呢?例如,数据库中是否有100000个父实体?其他变体会更快吗?为什么?我没有Derby方面的经验-所以我不知道对于超过100000*25000个条目的表,这是如何执行的。但这听起来已经像是一个大数据问题,因为具有两个双字节的Rutentry(没有任何管理和索引开销)的工作负载大约需要55 GB。因此,您还应该检查SQL数据库之外的其他解决方案。关于我的方法,与你的3个变体相比:你的任何一个都不会更快。其他解决方案是什么?其他解决方案是什么:阅读。刚刚执行了持久化10个实体的小测试@ElementCollection
方法与序列化
在同一台机器上进行比较。结果:相应地,30秒对500秒。可以吗?也许我只是没有正确配置数据库/服务器?
class ParentEntity {
@OneToMany(mappedBy = "parent", fetch = FetchType.LAZY)
Collection<SingleSleeper> singleSleepers;
@OneToMany(mappedBy = "parent", fetch = FetchType.LAZY)
Collection<RutEntry> rutEntries;
}
ParentEntity parent = entityManager.find(ParentEntity.class, id);
// JPQL:
List<SingleSleeper> singleSleepers = entityManager.createQuery(
"SELECT s FROM SingleSleeper s WHERE s.parent = %parent"
).setParameter("parent", parent).getResultList();
// Or Criteria API:
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<SingleSleeper> query = criteriaBuilder.createQuery(SingleSleeper.class);
Root<SingleSleeper> s = query.from(SingleSleeper.class);
query.select(s).where(criteriaBuilder.equal(s.get(SingleSleeper_.parent), parent));
List<SingleSleeper> singleSleepers = entityManager.createQuery(query).getResultList();