如何仅通过一次击中数据库来将对象列表存储在数据库中?

时间:2018-11-23 09:13:56

标签: hibernate spring-mvc

我正在尝试在数据库中保存问题列表。问题是说“如果列表中有2000个问题”,并且想将该列表保存到数据库中,则必须打2000次数据库。如何避免这种情况?

我将问题保存在数据库中的代码是:

public boolean saveQuestionsToDatabase(List<Question> eventQuestionList)
{
    try
    {
        int saveQuestionCounter = 0;
        for(Question question : eventQuestionList)
        {
            entityManager.merge(question);
            saveQuestionCounter++;
        }

        return (eventQuestionList.size()==saveQuestionCounter);
    }
    catch (Exception e) 
    {
        return false;
    }
}

任何帮助/建议都将非常有帮助。预先感谢。

2 个答案:

答案 0 :(得分:0)

您应该构建一个查询,将列表中的所有项目放在这里。 例如,oracle具有INSERT ALL语句,您可以在其中编写多个插入,这要快得多。或者在MySql中可以这样做

    INSERT INTO MyTable ( Column1, Column2, Column3 )
    VALUES ('John', 123, 'Question 1'), 
           ('Jane', 124, 'Question 2'), 
           ('Billy', 125, 'Question 3'),
           ('Miranda', 126, 'Question 4');

取决于您使用的数据库

答案 1 :(得分:0)

您可以像下面一样使用Batch processing,并使用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();