【发布时间】:2013-07-23 18:02:54
【问题描述】:
我有一个数据模型,它在一个实体和 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
【问题讨论】:
-
您可以发布您的 ONE TO MANY 注释或 hbm.xml 吗?
-
我已经更新了原帖。问题很可能是这样一个事实,即它为每个 LIGHT 对象创建了一个 INSERT 语句(对于 6 个其他对象也是如此),因此它最终在一个事务中执行了大约 500 次插入。
-
我认为应该没有性能问题,除非你在这么多线程中这样做。也许您可以尝试设置批量大小参数?或者使用
.createNativeQuery()代替,如果您认为 sql 更快且值得。 -
是的,我知道本机查询可能会更快,但我不期待为以这种方式链接的 11 个实体编写本机查询!此外,对同一个表执行 500 次插入总是比插入 500 个值慢。 (插入 .... 值 (), (), (), ....)
-
批量大小参数怎么样?至少您可以节省一些往返数据库的时间。你能发布你的代码来插入那个实体吗?
标签: hibernate jpa playframework bulkinsert playframework-1.x