一尘不染

JPA / Hibernate提高批处理插入性能

hibernate

我有一个数据模型,该数据模型在一个实体和其他11个实体之间具有一对多关系。这12个实体一起代表一个数据包。我遇到的问题是与这些关系的“许多”方面发生的插入次数有关。其中一些可以具有多达100个单独的值,因此要将一个完整的数据包保存在数据库中,最多需要500次插入。

我正在将MySQL 5.5与InnoDB表一起使用。现在,通过测试数据库,我发现在处理批量插入时,它每秒可以轻松地每秒进行15000次插入(使用LOAD
DATA甚至可以进行更多操作,但这在这种情况下不切实际)。

是否有某种方法可以使用Hibernate将这500个单独的插入片段组合成5个具有100个值的插入片段(对于5个具有100个值的链接实体)?

按照要求:

@OneToMany(mappedBy="beat", cascade=CascadeType.ALL)
@OrderBy("miliseconds ASC")
public List<AmbientLight> lights;

我可能还应该提到一条重要信息-我正在使用 Play! 框架1.2.3


阅读 435

收藏
2020-06-20

共1个答案

一尘不染

我已经通过为每个“插入”组使用hibernate会话来解决了这个问题。结果使保存数据所需的时间减少了约7倍。过去需要大约2000毫秒来保存一个“数据包”,而现在要做同一件事需要200毫秒至300毫秒。

只是重复一遍-这对 Play 有效 框架1.2.3- 我不确定这是否或如何适用于其他使用Hibernate的框架或应用程序。

    Session mySession = (Session) Pressure.em().getDelegate();

    for(int i = 0 ; i < data.size() ; i++){
        initializeFromJsonAndSave(data.get(i), mySession);
    }
    s.flush();
    s.clear();

更改了“ initializeFromJsonAndSave”方法,以便调用 mySession.save(myNewObject)*
而不是调用对象的 save() 方法。
*

2020-06-20