Spring:这种模式是否是线程安全的?

Jay*_*Pea 5 java spring hibernate web-applications thread-safety

我一直在学习如何使用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);
    }
}
Run Code Online (Sandbox Code Playgroud)

ara*_*nid 4

如果您在 Hibernate 配置中设置了合适的策略,那么sessionFactory.getCurrentSession()将返回一个范围会话,而不是全局会话。会话工厂旨在成为单例,这是完全正确的;getCurrentSession()是桥接到当前上下文范围的常用方法。

“合适的策略”各不相同,但如果您使用围绕 DAO 的 Spring 事务管理,那么会话将具有 DAO 方法调用的生命周期,并且 Spring 将在退出时根据需要协调调用提交/回滚。