Многозначные вставки Mysql с использованием HibernateTemplate - PullRequest
2 голосов
/ 20 мая 2010

Я использую Spring HibernateTemplate и мне нужно каждую секунду вставлять сотни записей в базу данных mysql.

Не уверен, что это самый эффективный способ сделать это, но я пытаюсь увидеть, как многозначные вставки mysql делают, используя hibernate.

String query = "insert into user(age, name, birth_date) values(24, 'Joe', '2010-05-19 14:33:14'), (25, 'Joe1', '2010-05-19 14:33:14')"

getHibernateTemplate().execute(new HibernateCallback(){
 public Object doInHibernate(Session session) throws HibernateException, SQLException {
      return session.createSQLQuery(query).executeUpdate();
 }
});

Но я получаю эту ошибку: 'не удалось выполнить собственный запрос на массовые манипуляции.' Пожалуйста, проверьте ваш запрос .....

Любая идея, я могу использовать многозначную вставку MySQL, используя Hibernate? или мой запрос неверен?

Есть ли другие способы улучшить производительность? Я попробовал метод saveOrUpdateAll (), но этого было недостаточно!

Ответы [ 5 ]

1 голос
/ 21 мая 2010

Из раздела 14.1 из документов Hibernate:

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();

Таким образом, вам нужно будет передать коллекцию кортежей, которые вы пытаетесь сохранить, сконструировать их как постоянные объекты, а затем сохранить их, сбрасывая через некоторый требуемый интервал.

Если этого недостаточно, я бы предложил Hibernate - паршивое решение для того, что вы пытаетесь сделать.

0 голосов
/ 26 ноября 2010

Я согласен с Мэтью Флинном. В Hibernate нет особого смысла, если вы все равно собираетесь прямо в JDBC. Если ваши объекты отображаются как объекты, вы можете просто сохранить их с помощью session.save () в пакетном режиме, периодически сбрасывая и очищая сеанс, чтобы у вас не было нехватки памяти.

0 голосов
/ 02 октября 2010

Мы используем iBatis для получения высокопроизводительного DML поверх mySQL. Это лучше, чем JDBC, так как другой уровень абстракции. В iBatis есть пакетные операции, которые также включают вставки.

Просто создайте другой интерфейс DAO, специфичный для этих случаев, и попросите его реализовать его с помощью iBatis (FooSQLMap, который реализует FooDAO). Вы можете позвонить в новый FooDAO из своего сервиса, что сделает его невидимым для вызывающего абонента.

0 голосов
/ 16 июля 2010

HibernateTemplate имеет метод bulkUpdate, который должен работать для этого

0 голосов
/ 28 мая 2010

Я склонен использовать Hibernate только для операций с одним объектом.

Для средних объемов данных, как в отчетах, мне нравится Spring JdbcTemplate.

Для очень больших пакетных вставок я сгенерирую входной файл с разделенными табуляцией значениями (после фильтрации вкладок из данных) и буду использовать любую программу оболочки, которую база данных предоставляет для пакетного ввода, такую ​​как MySql mysqlimport. Эти два шага могут выполняться на разных машинах для масштабирования большого объема импортируемых данных.

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