2017-06-12 56 views
0

我想通過從多個線程調用以下方法來測試我的SPRING MVC服務性能。該方法使用Hibernate獲取記錄,然後再次更新。 但似乎所有線程都按順序執行,而不是並行執行。Java休眠 - 讓多個線程同時運行

我的服務方法

@Transactional 
public String performOperation() { 
    USER user = dao.findUsr("name"); 
    user.setMarks(50); 
} 

我的測試應用程序

*Round 1* 
thread1.start() : For Only T1, It takes time to execute : 5 Sec 

*Round 2* 
thread1.start() 
thread2.start() : With T1 and T2: 10 Sec 

*Round 3* 
thread1.start() 
thread2.start() 
thread3.start() : With T1, T2, T3: 15 sec 

*Round 4* 
thread1.start() 
thread2.start() 
thread3.start() 
thread4.start() : With T1, T2, T3, T4: 20 sec 

我的配置

jdbc.initial.pool.size=10 
jdbc.min.pool.size=10 
jdbc.max.pool.size=120 

不設置任何低於設置:因此,採取默認值,它

- current_session_context_class 
- cache 

觀察:即使是5000每線程循環,利用最大DB池大小爲25.在MySQL儀表板觀察

問題 如果你看到它沒有並行執行。 Hibernate正在鎖定我猜的那一行。你可以提供任何指針來同時運行它。

+0

在你的例子中,你正在更新單行作爲唯一的行動(以及你正在閱讀它,但這很不值得一提,因爲行被鎖定)。沒有辦法同時做到這一點,這就是爲什麼你沒有獲得任何性能使用額外的線程 –

+0

Thx的答覆。只想添加一個要點,在我的方法findUsr(「名稱」)中,名稱總是不同的。所以所有線程都在不同的行上工作。如果我啓動4個線程,如果它們具有不同的名稱,則選擇不同的行。我可以看到行隨機更新爲db,但執行所需的總時間按順序增加。使用MySQL數據庫,僅供參考 –

+0

任何人,對此的任何評論;我們是否需要在Hibernate或MYSQL中進行任何設置? –

回答

0

要在完全相同的時間啓動線程,我會建議給CyclicBarrier一個嘗試。

CyclicBarrier是「允許一組線程彼此等待以達到共同障礙點的同步輔助工具」。

在該文檔中是它如何工作和運行的示例。在你的代碼中引用它。例如:

final CyclicBarrier gate = new CyclicBarrier(5); 

Thread thread1 = new Thread(){ 
public void run(){ 
    gate.await(); // Waits until all parties have invoked await on this barrier. 
    //Your Code  
}}; 
Thread thread2 = new Thread(){ 
public void run(){ 
    gate.await(); 
    //Your Code  
}}; 
Thread thread3 = new Thread(){ 
public void run(){ 
    gate.await(); 
    //Your Code  
}}; 
Thread thread4 = new Thread(){ 
public void run(){ 
    gate.await(); 
    //Your Code  
}}; 

thread1.start(); 
thread2.start(); 
thread3.start(); 
thread4.start(); 
gate.await(); 
+0

Thx回覆蓬鬆。但問題出在服務器端,客戶端只是壓力測試的模擬器。需要知道爲什麼我的行被鎖定,儘管選擇了不同的行 –