Когда самое время очистить ()?Имеет ли он высокую производительность?
Через равные промежутки времени, в идеале, такие же, как размер пакета JDBC, после сброса изменений.Документация описывает общие идиомы в главе о Пакетная обработка :
При создании постоянных новых объектов сбрасывайте (), а затем регулярно очищайте () сеанс, чтобы контролировать размер кэша первого уровня.
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();
И это не должно иметь производительность стоимость , с другой стороны:
- это позволяет сохранять количество объектов, отслеживаемых на предмет загрязнения, низким (поэтому промывка должна быть быстрой),
- это должно позволить восстановить память.
Почему такие объекты, как bar или baz не запускаются / GCd автоматически?Какой смысл держать их в сеансе после фиксации (в следующем цикле итерации они все равно недоступны)?
Вам нужно явно clear()
сеанс, если вы этого не сделаетехотите отслеживать сущности, вот и все, вот как это работает (может потребоваться зафиксировать транзакцию без «потери» сущностей).
Но из того, что я вижу, экземпляры bar и baz должны стать кандидатами в GC после очистки.Было бы интересно проанализировать дамп памяти, чтобы увидеть, что именно происходит.
Безопасно / рекомендуется ли вызывать org.hibernate.Session # clear () напрямую
Пока вы flush()
ожидающие изменения, чтобы не потерять их (если это не то, что вы хотите), я не вижу никаких проблем с этим (ваш текущий код потеряет цикл создания каждые 100, но, возможно, это просто псевдокод).
Если ответ на поставленный выше вопрос верен, что произойдет с объектом foo, если предположить, что clear () вызывается внутри цикла?Что если foo.foo () является методом отложенной загрузки?
Вызов clear()
исключает все загруженные экземпляры из Session
, делаяих отдельные лица.Если последующий вызов требует, чтобы объект был «присоединен», он потерпит неудачу.