Пакетный режим вставки с режимом гибернации и оракула: кажется, молча возвращается в медленный режим - PullRequest
2 голосов
/ 22 июля 2010

Я пытаюсь получить пакетную вставку, работающую с Hibernate, в Oracle, в соответствии с тем, что я прочитал здесь: http://docs.jboss.org/hibernate/core/3.3/reference/en/html/batch.html, но с моим сравнительным тестом это выглядит не так быстро, как раньше.

Кто-нибудь может предложить способ доказать, использует ли Hibernate пакетный режим или нет?Я слышал, что существует множество причин, по которым он может незаметно перейти в обычный режим (например, ассоциации и сгенерированные идентификаторы), поэтому есть ли какой-нибудь способ выяснить, почему он стал не пакетным?

Мой hibernate.cfg.xmlсодержит эту строку, которая, как мне кажется, это все, что мне нужно, чтобы включить пакетный режим:

<property name="jdbc.batch_size">50</property>

Мой код вставки выглядит следующим образом:

List<LogEntry> entries = ..a list of 100 LogEntry data classes...
Session sess = sessionFactory.getCurrentSession();
for(LogEntry e : entries) {
  sess.save(e);
}
sess.flush();
sess.clear();

Мой класс 'logentry' не имеет ассоциаций,единственное интересное поле - идентификатор:

@Entity
@Table(name="log_entries")
public class LogEntry {
  @Id @GeneratedValue
  public Long id;
  ..other fields - strings and ints...

Однако, поскольку это оракул, я считаю, что @GeneratedValue будет использовать генератор последовательности .И я верю, что только генератор «identity» остановит массовые вставки.

Так что если кто-нибудь может объяснить, почему он не работает в пакетном режиме, или как я могу точно узнать, если он работает или нет »Буду в пакетном режиме или выяснить, почему hibernate беззвучно возвращается в медленный режим, я был бы очень признателен.

Спасибо

Ответы [ 4 ]

2 голосов
/ 23 июля 2010

(...), но с моим сравнительным тестом это выглядит не так быстро, как раньше.

До чего?Что вы измеряете?Что ты изменил?Как мы можем догадаться, что?

Кто-нибудь может предложить способ доказать, использует ли Hibernate пакетный режим или нет?

Активировать запись в режиме отладки,1011 * class - который является реализацией интерфейса Batcher, который на самом деле использует пакетную обработку - регистрирует такие записи:

log.debug( "Executing batch size: " + batchSize );

Возможно, вам следует рассмотреть возможность использования StatelessSession вместо.

1 голос
/ 03 июля 2012

Если метаданные jdbc отключены с помощью:

hibernate.temp.use_jdbc_metadata_defaults

, то пакетирование jdbc не выполняется.Это дело в спящем режиме 3.3.2.GA.

0 голосов
/ 05 июня 2014

Вы не видели улучшения производительности, потому что:

От: http://docs.oracle.com/cd/B28359_01/java.111/b31224/oraperf.htm

"Реализация стандартной пакетной обработки в Oracle не реализовать истинную пакетную обработку для обобщенных операторов и вызываемых заявления. Хотя Oracle JDBC поддерживает использование стандартных пакетирование для объектов Statement и CallableStatement, вы вряд ли чтобы увидеть улучшение производительности. "

И если вы включите собственную пакетную обработку Oracle, это нарушит режим гибернации, потому что обновления не работают. По крайней мере, это то, что я нашел.

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

Решением было перейти к log4j и включить ведение журнала уровня отладки, а затем найти строку:

AbstractBatcher - Executing batch size: *

в thelog / console.В моем случае был в пакетном режиме, просто Hibernate действительно работает медленно!

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