Ich entwickelte eine Anwendung mit @Transactional Annotation auf Spring Service-Klasse. Um auf die Datenbankebene zuzugreifen, habe ich die Klasse AbstractDao, die bei Bedarf die aktuelle Sitzung zurückgibt. d.hBest Practices für nicht transaktionale DB-Aufrufe mit Spring MVC und Hibernate
@Autowired
@Qualifier("sessionFactory")
private SessionFactory sessionFactory;
protected Session getSession() {
session = sessionFactory.getCurrentSession();
}
protected Criteria createEntityCriteria() {
return getSession().createCriteria(persistentClass);
}
public List<T> findByCriteria(Criterion criterion) {
Criteria criteria = createEntityCriteria();
criteria.add(criterion);
return criteria.list();
}
Ich denke an das Entfernen grenzüberschreitende Unterstützung, wie ich wirklich brauche es nicht, und ich möchte die Leistung von db Anrufe verbessern, wie ich viele Anzahl von db Einsätze pro Sekunde unterstützen.
1) Ist es in Ordnung, nicht transnationale db-Operationen mit Hibernate und Spring zu verwenden?
2) Wie kann ich den obigen Code ändern, um nicht Transaktionen zu unterstützen? Kann ich obigen Code wie folgt erstellen?
So createEntityCriteria() kann getSession() abrufen Sitzung. So können wir eine Sitzung pro Benutzeranforderung (HTTP-Spring-MVC-Anfrage) mit dem obigen Code verwalten.
Wenn es OK ist, sollte ich Sitzung am Ende der Benutzeranforderung schließen? Wenn also 300 MVC-Benutzeranforderungen pro Sekunde vorliegen, werden 300 JDBC-Aufrufe an die Datenbank geöffnet (da sessionFactory.openSession() einen neuen JDBC-Aufruf erstellt).
Sie sind nicht verpflichtet, Transaktionen zu verwenden, aber Sie sollten hier vorsichtig sein. Transaktionen sind nützlich, vielleicht ist ein bisschen Lesen in Ordnung. https://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html/ch13.html – Taylor