我试图通过从多个线程调用以下方法来测试我的SPRING MVC服务性能。该方法使用Hibernate获取记录,然后再次更新它。 但似乎所有线程都是按顺序执行,而不是并行执行。
我的服务方式
@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个循环,使用的最大数据库池大小为25.正如MySQL Dashboard中所观察到的那样
问题 如果你看到它没有并行执行。 Hibernate正在锁定我猜的行。你能提供任何指针来同时运行它。
答案 0 :(得分:0)
To start the threads at exactly the same time i would recommend giving CyclicBarrier a try.
CyclicBarrier is "A synchronization aid that allows a set of threads to all wait for each other to reach a common barrier point".
Within that Doc is an example of how it works and runs. Make reference to that within your code. For example:
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();