java - Spring:这个模式是线程安全的吗?

标签 java hibernate spring 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);
    }
}

最佳答案

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

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

关于java - Spring:这个模式是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8420496/

相关文章:

java - 访问 while 循环变量

java - 如何从 JSON 创建 Mongoose 模式

java - 如何从 JMeter 中的 CSV 文件获取随机数据

java - "The Love-Letter Mystery"问题中 hackerrank 的计时问题

hibernate - Spring + hibernate : transaction commits but data is not persisted

java - 使用 spring 将 http 响应作为字符串获取

java - Java 测试时间。更改 spock stub 值

java - 子表中未生成单向一对一映射外主键

java - org.hibernate.hql.internal.QueryExecutionRequestException : Not supported for DML operations [insert into

java - 使 spring 安全 session 无效