7

我需要休眠来生成这样的sql INSERT INTO table_a (a_id, a_name) VALUES (5, 'a5'),(6, 'a6');

使用这样的 sql,您可以使用 1 条语句添加 2 行。我可以得到

a_id, a_name

------------------
5     a5
6     a6

在休眠时,当您保存一组一对多关系时,休眠将插入多个插入语句。如果您使用 HQL 将 1000 行插入到 1 个表中,这将导致如下结果:

INSERT INTO scoring.table_a (`a_id`, `a_name`) VALUES (1, 'a');
INSERT INTO scoring.table_a (`a_id`, `a_name`) VALUES (2, 'a');
....
...
..
INSERT INTO scoring.table_a (`a_id`, `a_name`) VALUES (1000, 'a');

经过的时间是:

Executed 1,000 queries; elapsed time (seconds) - Total: 0.78, SQL query: 0.78, Building output: 0

当我使用相同的值进行测试时,使用 SQLINSERT INTO table_a (a_id, a_name) VALUES (5, 'a'),(6, 'a'),(),...,...,(1000, 'a');将导致经过的时间如下:

Query 1 of 1, Rows read: 0, Elapsed time (seconds) - Total: 0.02, SQL query: 0.02, Building output: 0

我的测试结果是,1 条 1000 值(0.02 秒)的语句将比 1000 条插入语句快大约 39 倍,每个语句都有 1 值(0.78 秒),就像休眠一样。那么有没有一种方法可以让 HQL 生成类似用于插入或更新的 SQL。或者这意味着我们必须覆盖休眠方言?

感谢您的任何提示

4

3 回答 3

1
于 2013-08-23T14:52:58.300 回答
0

您可以将hibernate.jdbc.batch_size属性设置为非零值。它将允许 Hibernate 使用批处理 INSERT。看看官方文档

以下代码是如何通过 Hibernate 使用 JDBC 批量插入的示例:

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
for ( int i=0; i < 10000; i++ ) {
    RecordA record = new RecordA(.....);
    session.save(record);
    if ( i % BATCH_SIZE == 0 ) { // BATCH_SIZE is your choice, but equal to property
        //flush a batch of inserts and release memory:
        session.flush();
        session.clear();
    }
}
tx.commit();
session.close();

这里也讨论了:Hibernate batch size混淆

于 2013-08-15T11:29:13.360 回答
0

在 Hibernate 文档中有一个关于批处理的非常好的章节。

设置属性

hibernate.jdbc.batch_size 20

然后使用此代码

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();

for ( int i=0; i<100000; i++ ) {
    Customer customer = new Customer(.....);
    session.save(customer);
    if ( i % 20 == 0 ) { //20, same as the JDBC batch size
        //flush a batch of inserts and release memory:
        session.flush();
        session.clear();
    }
}

tx.commit();
session.close();

customer根据您的需要从上面的代码中更改对象。

于 2022-01-11T04:11:44.090 回答