@Transactional 주석없이 트랜잭션을 관리 alertDAO 구현은 다음과 같습니다.봄은 내가 지금처럼 내 트랜잭션을 관리하는 봄 주석을 사용하고
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
// no annotation here either
public class HibernateAlertDAO extends HibernateDaoSupport implements AlertDAO {
public List<Alert> getAlerts(){
// some implementation details that define queryString
Query query = getSession().createQuery(queryString);
List<Alert> alerts = query.list();
return alerts;
}
}
데이터를 가져올 수있는 것처럼 보입니다. 주석 없이도 데이터베이스에서.
이런 부주의의 결과는 무엇이며 일어날 수있는 최악의 시나리오는 무엇입니까?
질문에 대해서는 세션 유출이 발생할 수 있습니다. 즉, 트랜잭션 경계가 없기 때문에 세션이 열리지 만 닫히지 않습니다 (스프링이 세션을 열고 닫는 데 사용함). 당신의 DA는 결함이있다. 당신은 HibernateDaoSupport 클래스에서 getSession을 호출해서는 안된다 (이것은 관리되지 않는 세션을 열 것이다). ('HibernateTemplate'과'HibernateDaoSupport'는 2006 년 어딘가에서 Hibernate 3.0.1에서 deprecated로 간주되어야합니다!). http://docs.spring.io/spring/docs/current/spring-framework-reference/html/orm.html#orm-hibernate-straight를 참조하십시오. –
기본적으로 트랜잭션 경계는 서비스 호출이 반환하거나 서비스 스레드 (웹 응용 프로그램의 경우)가 MVC 요청을 반환하는 위치가 아닌가? 비 웹 응용 프로그램 시나리오 인 경우 세션 유출이 큰 문제입니다. 그러나 그것이 존재하는 경우 현재 세션을 리턴 할 getSession()을 항상 호출하므로 그렇지 않습니까? 스레드 로컬에 저장되었으므로? –
@ M.Deinum은 http://stackoverflow.com/questions/42831749/hibernate-session-with-spring-transaction에서 비슷한 질문으로 의견을 제공 할 수 있습니까? – emilly