<分区>
我一直在学习如何使用 Spring 框架进行 hibernate 事务管理,到目前为止,它对这个目的有很大帮助。问题是最近,我意识到我没有过多考虑我选择的模式如何处理并发性,特别是在 Web 应用程序的情况下。
下面是示例我正在使用的模式的代码,它是我找到的一些示例和自定义 servlet 实现的组合。我对这个模式是如何工作的以及它是否是线程安全的有一些疑问,因为我对它进行了一些定制。我的一些担忧是:
- 尽管 servlet 在技术上不是单例,但我的印象是大多数时候每个 servlet 类只有一个实例。
- 如果我理解正确,每个自动连接的属性都是单例,所以如果以上为真,那么将有一个 servlet 实例和一个服务实例,而该实例又具有一个 DAO 实例,有自己的 SessionFactory 实例。
- 如果以上内容正确,那么我可以想象 servlet 上的每个请求都将使用相同的对象,我想知道这是否是一件好事。在考虑了一些之后,我无法判断线程安全是使用单例还是为每个 http 请求创建新实例更好。
- 通常这些 spring 模式有一个 @Controller 类,我跳过它以支持我们的自定义 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);
}
}