2013-03-17 11 views

Odpowiedz

11

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.

+1

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

+0

Wygląda na to, że jest to proxy, a prawdziwa bezstanowa sesja jest zamykana przez StatelessSessionSynchronization – user472749

2

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.

-3

To nie necesary można zrobić z tym:

public void bulkInsert(Collection<YourClass> yourObjects) 
    { 

     if (yourObjects == null || yourObjects.isEmpty()) { 
      return; 
     } 
     yourRepository.save(yourObjects); 

    }