0

我有一个简单的应用程序,它通过 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 的并发请求?

4

2 回答 2

1

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

于 2012-01-25T21:03:54.183 回答
1

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

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

于 2012-01-25T22:45:54.897 回答