Ответ 1
Хорошо, Так вот что я на самом деле делал, я не знаю, является ли это лучшим решением для этой проблемы, но в наших условиях, и поскольку я искал наиболее локализованное решение, мне это показалось лучше.
Я расширил springframework.orm.hibernate3.HibernateTemplate и создал новый MyHibernateTemplate. Основная роль нового шаблона - переопределить метод doExecute, который в конечном итоге приведет к большей части hibernate3.HibernateTemplate, а также предоставит некоторые функции, которые были предоставлены старыми SessionFactoryUtils (например, isSessionTransactional и applyTransactionTimeout).
Новый doExecute реплицирует логику старого, но вместо SessionFactoryUtils.getNewSession для получения сеанса сначала попытается найти открытый сеанс getSessionFactory(). getCurrentSession():
boolean newSessionOpened = false;
Session session;
if (enforceNewSession){
session = SessionFactoryUtils.openSession(getSessionFactory());
newSessionOpened = true;
} else {
try {
// look for an open session
session = getSessionFactory().getCurrentSession();
}
catch (HibernateException ex) {
try {
// if there isn't an open session, open one yourself
session = getSessionFactory().openSession();
newSessionOpened = true;
} catch (HibernateException e) {
throw new DataAccessResourceFailureException("Could not open Hibernate Session", ex);
}
}
}
// is the open session, is a session in a current transaction?
boolean existingTransaction = (!enforceNewSession &&
(!isAllowCreate() || isSessionTransactional(session, getSessionFactory())));
Вам просто нужно закрыть этот сеанс вручную:
finally {
// if session was used in an existing transaction restore old settings
if (existingTransaction) {
//logger.debug("Not closing pre-bound Hibernate Session after HibernateTemplate");
disableFilters(session);
if (previousFlushMode != null) {
session.setFlushMode(previousFlushMode);
}
}
// if not and a new session was opened close it
else {
// Never use deferred close for an explicitly new Session.
if (newSessionOpened) {
SessionFactoryUtils.closeSession(session);
//_log.info("Closing opened Hibernate session");
}
}
Я стараюсь держать этот ответ коротким, но если есть какие-то вопросы, я могу подробнее остановиться на этой проблеме.