Как сохранить список объектов в базе данных, нажав на базу данных только один раз? - PullRequest
0 голосов
/ 23 ноября 2018

Я пытаюсь сохранить список вопросов в базе данных.Проблема, скажем, «если у меня есть 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 голосов
/ 23 ноября 2018

Вы можете использовать Пакетная обработка , как показано ниже, и установить размер партии с помощью 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();
0 голосов
/ 23 ноября 2018

Вы должны создать один запрос, в который вы помещаете все свои элементы из списка.Например, у 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');

Зависит от базы данных, которую вы используете

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...