2017-06-12 64 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回复蓬松。但问题出在服务器端,客户端只是压力测试的模拟器。需要知道为什么我的行被锁定,尽管选择了不同的行 –