2012-01-25 32 views
0

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

在控制器我有这样的事情:

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

日志说,“DoSomething的” threws在目前还没有传入的列表数据的一些NullPointerException异常。

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

+1

究竟是什么问题? – axtavt

+0

对不起,我编辑了这个问题 – Randomize

+2

你的日志显示了什么500 – hvgotcodes

回答

1

@Transactional在多线程应用程序中工作得很好。事实上,所有的Web应用程序都是多线程的,每个Spring bean单例实例都处理所有的请求。所以问题不在那里。

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

+0

我已重新编辑我的问题 – Randomize

+0

我不认为是完全那样。所有由“@Transactional”创建的连接都被引用到同一个线程中。对于多线程情况,您需要“同步”(至少)您的@Transactional方法。顺便说一句,“同步”已经修复它 – Randomize

+1

不,这是错误的。 syncorhnized的方法会杀死你的应用程序。 – Bozho

1

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

+0

我重新编辑了我的问题 – Randomize

+0

@Randomize:你做错了什么。你的控制器如何实现?它是如何从servlet调用的或接收到请求的任何东西? – Olaf