【问题标题】:Force Hibernate or general JPA vendor to use INSERT INTO with multiple values?强制 Hibernate 或一般 JPA 供应商使用具有多个值的 INSERT INTO?
【发布时间】:2017-09-25 18:07:14
【问题描述】:

我找到了,那个方法

Iterable<S> CrudRepository#save(Iterable<S> entities)

工作很慢。

如果相反,我自己使用Iterable 并创建这样的长查询

INSERT INTO mytable (field1, field2) VALUES
(value1, value2),
(value3, value4),
...
(valueN, valueM);

并针对实体管理器执行它,它的工作速度要快得多(10 倍甚至更多)。

我可以让 Spring-Data 本身以同样快的速度工作吗?

例如,是否有任何选项可以强制 Hibernate 或任何底层库使用此类多值查询?

我正在使用 SQLite 和这里​​的课程:https://stackoverflow.com/a/24233241/258483

我能不能以某种方式改进这门课?

更新

我正在使用身份生成与

@Entity
@Table(name = "variable_values")
public class VariableValue {

   @Id
   @Column(name="id")
   @GeneratedValue(generator="sqlite")
   @TableGenerator(name="sqlite", table="sqlite_sequence",
      pkColumnName="name", valueColumnName="seq",
      pkColumnValue="variable_values")
   @Getter
   @Setter
   private long id;

这是否意味着我无法从批处理中受益?

【问题讨论】:

    标签: java hibernate sqlite jpa spring-data


    【解决方案1】:

    您必须指定hibernate.jdbc.batch_size 选项以启用插入语句的自动批处理。 Here 是此选项和相关选项的更多详细信息。

    但是,您还必须验证是否一切都已正确完成,以便在 SQLite 方言的自定义实现中支持它。

    【讨论】:

    • 据说,当身份生成发生时,批处理被禁用。但这是我的情况。我不仅在生成 id-s,而且以适合 Sqlite 的奇怪方式执行此操作!
    • 请看我的更新。如果我使用 ID 生成,我可以从批处理中受益吗?
    • 你的id生成策略不是IDENTITY,而是基于表的,所以理论上可以使用批处理。但正如我在答案中所说,这可能取决于您使用的自定义方言的功能,您必须尝试调查它。
    猜你喜欢
    • 2022-01-04
    • 2014-02-12
    • 2011-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-14
    • 2023-02-21
    • 1970-01-01
    相关资源
    最近更新 更多