【发布时间】:2016-11-07 16:11:42
【问题描述】:
我正在开发一个在 Spring 服务类上带有 @Transactional 注释的应用程序。要访问 db 层,我有 AbstractDao 类,它在需要时返回当前会话。即
@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();
}
我正在考虑删除跨国支持,因为我真的不需要它,并且我想提高数据库调用的性能,因为我必须支持每秒许多数量的数据库插入。
1) Hibernate 和 Spring 可以使用非跨国数据库操作吗?
2) 那么我怎样才能改变上面的代码来支持非事务呢? 我可以按如下方式创建上面的代码吗?
private Session session;
protected Session getSession() {
if (session == null) {
session = sessionFactory.openSession();
}
return session;
}
所以 createEntityCriteria() 可以调用 getSession() 获取会话。所以我们可以使用上面的代码为每个用户请求(HTTP spring MVC 请求)管理一个会话。
如果没问题,我应该在用户请求结束时关闭会话吗?因此,如果每秒有 300 个 MVC 用户请求,那么它将打开 300 个对 DB 的 JDBC 调用(因为 sessionFactory.openSession() 创建一个新的 JDBC 调用)。
【问题讨论】:
-
你不需要使用事务,但你应该在这里小心。事务是有用的,也许有点阅读是为了。 docs.jboss.org/hibernate/orm/4.3/manual/en-US/html/ch13.html
标签: spring hibernate spring-mvc jdbc spring-transactions