2012-01-25 71 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