【发布时间】:2014-02-14 05:21:06
【问题描述】:
我正在使用 Spring 注释来管理我的事务,如下所示:
@Transactional(readOnly = true)
public class AlertServiceImpl implements AlertService {
private AlertDAO alertDAO;
public List<Alert> getAlerts(){
List<Alert> alerts = alertDAO.getAlerts();
return alerts;
}
}
我想知道如果我忘记了注释会发生什么:
// Oops! Forgot to use transactional annotation
public class AlertServiceImpl implements AlertService {
private AlertDAO alertDAO;
public List<Alert> getAlerts(){
List<Alert> alerts = alertDAO.getAlerts();
return alerts;
}
}
当 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;
}
}
Hibernate 似乎允许我在没有注释的情况下从数据库中获取数据。
这种粗心大意的后果是什么?可能发生的最坏情况是什么?
【问题讨论】:
-
关于您的问题,您可能会遇到会话耗尽,即会话已打开但由于没有事务边界(spring 用于打开/关闭会话)而从未关闭。您的 dao 有缺陷,您不应该在
HibernateDaoSupport类上调用getSession(这将打开一个非托管会话)。 (HibernateTemplate和HibernateDaoSupport必须被视为在 2006 年某个地方从 Hibernate 3.0.1 开始弃用!)。见docs.spring.io/spring/docs/current/spring-framework-reference/…。 -
事务边界是否不是默认情况下服务调用返回的地方或服务线程(在 webapp 的情况下)返回 MVC 请求的地方?如果这是一个非网络应用场景,那么是的,会话消耗是一个大问题。但是,因为它总是调用 getSession() ,如果它存在,它将返回当前会话,不是吗?因为它存储在线程本地?
-
@M.Deinum 您能否在stackoverflow.com/questions/42831749/… 提供您对类似问题的意见?
标签: java spring hibernate transactions