【问题标题】:Spring + Hibernate with transactions in multithreading environmentSpring + Hibernate 与多线程环境中的事务
【发布时间】:2012-01-25 19:13:54
【问题描述】:

我有一个简单的应用程序,它通过 Hibernate 从 db (MySQL 5.1) 上的一个表中获取一些数据并显示内容。使用的主要框架是 Spring 3.0。查询在 @Transactional(read-only) (+第二缓存级别)中正确运行。 问题出现在针对同一页面运行一些具有 20/30 请求的并发测试。一些页面请求返回 500 而不是 200。我想这是由于 @Transactional 不管理多线程访问(如果我错了,请纠正我)。

在控制器中我有这样的东西:

List<String> names = usersService.getUserNames(); // this executes query in @Transactional env
doSomething(names);

日志说“doSomething”会抛出一些 NullPointerException,因为列表中没有传递的数据。

有没有办法用 Spring+Hibernate 实现一个多线程访问管理器来管理对 db 的并发请求?

【问题讨论】:

  • 对不起,我已经编辑了问题
  • 你的日志揭示了关于 500 的哪些信息

标签: database multithreading hibernate spring transactional


【解决方案1】:

@Transactional 在多线程应用程序中运行良好。事实上,所有的 web 应用程序都是多线程的,每个 spring bean 单例实例处理所有请求。所以问题不存在。

当您收到错误 500 时,您应该检查日志文件。如果那里什么都没有,请确保您没有吞下一些异常。

【讨论】:

  • 我不认为完全一样。 “@Transactional”创建的所有连接都指向同一个线程。对于多线程情况,您需要“同步”(至少)您的 @Transactional 方法。顺便说一句,“同步”已经修复了它
  • 不,这是错误的。同步方法会杀死你的应用程序。
  • 对不起!你完全正确!这是配置中的一个小错误 :) 基本上我错过了 中“sessionFactory”bean 定义中 @transactional 的服务布局。
【解决方案2】:

您需要确保为每个传入请求分配一个单独的数据库连接。连接应在池中进行管理。数据库连接池的大小将(间接)决定您的应用程序可以同时处理多少个请求。

【讨论】:

  • @Randomize:你做错了什么。你的控制器是如何实现的?它是如何从 servlet 或接收请求的任何地方调用的?
猜你喜欢
  • 2015-03-05
  • 2012-06-26
  • 2018-02-23
  • 1970-01-01
  • 1970-01-01
  • 2020-07-11
  • 1970-01-01
  • 2019-02-10
  • 1970-01-01
相关资源
最近更新 更多