2013-03-17 6 views

Antwort

11

Eine Lösung ist es, eine Feder Fabrik Bohne zu implementieren diese StatelessSession zu erstellen und sie in Ihrer benutzerdefinierten Repositorys Implementierung zu injizieren:

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; 
    } 

} 

Überprüfen Sie die StatelessSessionFactoryBean und die volle Gist here. Mit Spring 3.2.2, Spring Data JPA 1.2.0 und Hibernate 4.1.9.

Dank dieser JIRA und der Typ, der StatelessSessionFactoryBean Code beigefügt. Hoffe, das hilft jemandem, es hat wie ein Zauber für mich funktioniert.

+1

Da eine Sitzung eine Datenbankverbindung hält, sind Sie besorgt über die gesamte Lebensdauer Ihrer StatelessSession Instanz? Wäre nicht die Lebensdauer der Verbindung, die von statelessSession gehalten wird, im Wesentlichen die gleiche wie die Lebensdauer der MyRepositoryImpl-Instanz? – mangotang

+0

Es sieht so aus, als wäre es ein Proxy und die reale statelessSession wird von StatelessSessionSynchronization geschlossen – user472749

2

Um noch bessere Performance-Ergebnisse Sie jdbc Batch-Anweisungen auf den SessionFactory/EntityManager, indem die hibernate.jdbc.batch_size Eigenschaft auf der Session Konfiguration (d.h .: LocalEntityManagerFactoryBean) aktivieren können.

Um einen optimalen Nutzen der jdbc Batch-Insert/Updates zu erhalten, schreiben Sie so viele Entitäten des gleichen Typs wie möglich. Hibernate erkennt, wenn Sie einen anderen Entitätstyp schreiben, und löscht den Stapel automatisch, auch wenn die konfigurierte Stapelgröße nicht erreicht wurde.

Die Verwendung der StatelessSession verhält sich im Prinzip genauso wie die Verwendung von etwas wie Spring JdbcTemplate. Der Vorteil der Verwendung der StatelessSession besteht darin, dass das Mapping und die Übersetzung in SQL von Hibernate übernommen wird. Wenn Sie meine StatelessSessionFactoryBean verwenden, können Sie sogar die Session und die StatelessSession gemischt in einer Transaktion mischen. Aber seien Sie vorsichtig beim Modifizieren einer Entity, die von der Session geladen wurde, und beharren Sie sie mit der StatelessSession, weil dies zu Sperrproblemen führen wird.

-3

Es necesary nicht Sie es mit diesem tun:

public void bulkInsert(Collection<YourClass> yourObjects) 
    { 

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

    } 
Verwandte Themen