Jay*_*Pea 5 java spring hibernate web-applications thread-safety
我一直在学习如何使用Spring框架进行hibernate事务管理,到目前为止,它已经为此目的提供了很大的帮助.问题是,最近,我意识到我没有考虑过我选择的模式如何处理并发,特别是在Web应用程序的情况下.
下面的代码举例说明了我正在使用的模式,它是我发现的一些示例和自定义servlet实现的组合.我有点怀疑这个模式是如何工作的,以及它是否是线程安全的,因为我对它进行了一些定制.我的一些担忧是:
谢谢
public interface UserDAO
{
public void save(User user);
}
@Repository
public class HibernateUserDAO implements UserDAO
{
@Autowired(required=true)
protected SessionFactory sessionFactory;
public void save(User user)
{
this.sessionFactory.getCurrentSession().save(user);
}
}
public interface UserService
{
public void saveUser(User user);
}
@Service
public class DefaultUserService implements UserService
{
@Autowired(required=true)
private UserDAO userDAO;
@Transactional
public void saveUser(User user)
{
this.userDAO.save(user);
}
}
public class UserServlet extends CustomServlet
{
@Autowired(required=true)
private UserService userService;
public void init() throws ServletException
{
super.init();
SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
}
protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
//would call the appropriate method depending on parameters, etc.
//simplified here for demonstration purposes
this.userService.saveUser(user);
}
}
Run Code Online (Sandbox Code Playgroud)
如果您在 Hibernate 配置中设置了合适的策略,那么sessionFactory.getCurrentSession()将返回一个范围会话,而不是全局会话。会话工厂旨在成为单例,这是完全正确的;getCurrentSession()是桥接到当前上下文范围的常用方法。
“合适的策略”各不相同,但如果您使用围绕 DAO 的 Spring 事务管理,那么会话将具有 DAO 方法调用的生命周期,并且 Spring 将在退出时根据需要协调调用提交/回滚。