Używam Spring + Spring Data JPA z Hibernate i potrzebuję wykonać duże i kosztowne operacje na bazach danych.Jak używać StatelessSession z wiosennymi danymi JPA i Hibernate?
Jak mogę użyć StatelessSession
do wykonywania tego rodzaju operacji?
Używam Spring + Spring Data JPA z Hibernate i potrzebuję wykonać duże i kosztowne operacje na bazach danych.Jak używać StatelessSession z wiosennymi danymi JPA i Hibernate?
Jak mogę użyć StatelessSession
do wykonywania tego rodzaju operacji?
Rozwiązaniem jest zaimplementować fasoli Wiosna fabryki do tworzenia tej StatelessSession
i wstrzyknąć go w realizacji niestandardowych repozytoriów:
public class MyRepositoryImpl implements MyRepositoryCustom {
@Autowired
private StatelessSession statelessSession;
@Override
@Transactional
public void myBatchStatements() {
Criteria c = statelessSession.createCriteria(User.class);
ScrollableResults itemCursor = c.scroll();
while (itemCursor.next()) {
myUpdate((User) itemCursor.get(0));
}
itemCursor.close();
return true;
}
}
Sprawdź StatelessSessionFactoryBean
i pełną GIST here. Używanie Spring 3.2.2, Spring Data JPA 1.2.0 i Hibernate 4.1.9.
Dzięki temu JIRA i facetowi, który podłączył kod StatelessSessionFactoryBean
. Mam nadzieję, że to pomaga komuś, to działało dla mnie jak urok.
Aby uzyskać jeszcze lepsze osiągi wyników można włączyć jdbc sprawozdań partii na SessionFactory
/EntityManager
poprzez ustawienie właściwości hibernate.jdbc.batch_size
konfiguracji SessionFactory (tj .: LocalEntityManagerFactoryBean
).
Aby uzyskać optymalną korzyść z włożenia/aktualizacji partii wsadowej jdbc, należy napisać tyle jednostek tego samego typu, ile to możliwe. Hibernacja wykryje, kiedy napiszesz inny typ obiektu i automatycznie opróżni partię, nawet jeśli nie osiągnie skonfigurowanego rozmiaru partii.
Korzystanie z funkcji StatelessSession zachowuje się w zasadzie tak samo, jak w przypadku aplikacji Spring JdbcTemplate
. Zaletą korzystania z StatelessSession
jest odwzorowywanie i tłumaczenie na SQL obsługiwane przez Hibernate. Kiedy używasz mojego StatelessSessionFactoryBean
możesz nawet wymieszać Session
i StatelessSession
wymieszany w jednej transakcji. Ale należy zachować ostrożność, modyfikując jednostkę ładowaną przez Session
i zachowując ją z StatelessSession
, ponieważ spowoduje to problemy z blokowaniem.
To nie necesary można zrobić z tym:
public void bulkInsert(Collection<YourClass> yourObjects)
{
if (yourObjects == null || yourObjects.isEmpty()) {
return;
}
yourRepository.save(yourObjects);
}
Ponieważ sesja posiada połączenia z bazą danych, jesteś zaniepokojony trwania instancji statelessSession? Czy żywotność połączenia posiadanego przez bezpaństwowca nie byłaby zasadniczo taka sama jak czas trwania instancji MyRepositoryImpl? – mangotang
Wygląda na to, że jest to proxy, a prawdziwa bezstanowa sesja jest zamykana przez StatelessSessionSynchronization – user472749