Ich benutze Spring + Spring Data JPA mit Hibernate und ich muss einige große und teure Datenbankoperationen durchführen. Wie kann ich StatelessSession
verwenden, um diese Art von Operationen durchzuführen?Verwendung von StatelessSession mit Spring Data JPA und Hibernate?
Antwort
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.
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.
Es necesary nicht Sie es mit diesem tun:
public void bulkInsert(Collection<YourClass> yourObjects)
{
if (yourObjects == null || yourObjects.isEmpty()) {
return;
}
yourRepository.save(yourObjects);
}
- 1. Unterschied zwischen Spring-JPA und Spring-Data-JPA
- 2. Spring Data JPA, Hibernate-Anbieter, Mandantenfähigkeit und Postgres SQL
- 3. Spring + Hibernate versus Spring Data JPA: Sind sie anders?
- 4. Spring Data JPA und QueryDSL
- 5. Spring Data JPA und NamedEntityGraphs
- 6. Spring Data JPA und Generics
- 7. Ist Spring Data JPA eine JPA-Implementierung?
- 8. Spring Data JPA und Exists Abfrage
- 9. Spring Data JPA Fetching
- 10. TransactionRequiredException mit DBUnit und Spring Data JPA
- 11. Spring + Hibernate + JPA
- 12. Spring Data JPA
- 13. Umleiten der JDBC-Verbindung ohne Verwendung von Spring/JPA/Hibernate
- 14. Spring Data JPA - Spezifikationen und Querydsl
- 15. Spring Data JPA: query ManyToMany
- 16. -Update geschieht nicht mit Spring Data JPA
- 17. Spring Data JPA statt aktualisieren
- 18. Dynamic Spring Data JPA-Abfrage mit Array
- 19. Holen Hibernate SessionFactory von JPA EntityManagerFactory
- 20. Spring Data JPA: Check Existiert Entity ID mit @Query Annotation
- 21. Spring Data (JPA) - mit Generics in @Query
- 22. Verwenden von Spring transactionManager in JPA/Hibernate
- 23. Spring Data JPA Unterschied zwischen findBy/findAllBy
- 24. Mehrere Datenbanken mit Spring + Hibernate + JPA
- 25. Spring Data JPA „OR“ mit einzelnen Parameter
- 26. Arbeiten mit Spring Data JPA, Hibernate und Multiple Transaction Manager: Keine Bean namens "transactionManager" ist definiert
- 27. SPRING DATA JPA speichern @OneToMany Beziehung
- 28. Simultane Nutzung von Hibernate und Spring Daten jpa?
- 29. Java SE + Spring Data + Hibernate
- 30. Empfohlener Logger zur Verwendung mit Java, Hibernate und Spring
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
Es sieht so aus, als wäre es ein Proxy und die reale statelessSession wird von StatelessSessionSynchronization geschlossen – user472749