Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
存储';大型';数据,用Java中的列表表示,在数据库中?_Java_Jpa_Jta - Fatal编程技术网

存储';大型';数据,用Java中的列表表示,在数据库中?

存储';大型';数据,用Java中的列表表示,在数据库中?,java,jpa,jta,Java,Jpa,Jta,在数据库中存储由Java列表表示的“大型”数据的最佳实践是什么 我正在考虑3种变体: 使用“@OneToMany”将数据存储在单独的表中 序列化数据并将其存储在父表中 将数据存储为文件(命名约定?与id相同?) 更具体地说 “大型”数据实体: class SingleSleeper{ private Double startPositionOnLeft; private Double endPositionOnLeft; private Double startPosi

在数据库中存储由Java列表表示的“大型”数据的最佳实践是什么

我正在考虑3种变体:

  • 使用“@OneToMany”将数据存储在单独的表中
  • 序列化数据并将其存储在父表中
  • 将数据存储为文件(命名约定?与id相同?)
  • 更具体地说

    “大型”数据实体:

    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;
    }
    
    这种方法有三个优点:

  • 仍然易于阅读-如果您将加载放入其自己的方法中
  • 您可以灵活地决定何时加载25050个孩子
  • 您还可以加载子项的子集(通过使用
    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();