2

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

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

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

按照要求:

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

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

4

2 回答 2

3

我已经设法通过对每个“组”插入使用 Hibernate Sessions 来解决这个问题。结果是保存数据所需的时间减少了大约 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' 方法已更改,因此不是调用对象的save()方法,而是调用mySession.save(myNewObject)

于 2013-07-26T10:54:35.943 回答
1

这里有两个关于这个问题的好答案

请注意,使用身份生成器(它是默认情况下与 play 一起使用的生成器)批量插入被禁用。

于 2013-07-25T07:43:30.140 回答