我正致力于数据可视化。我有一个MySQL数据库,java后端,js前端。我通过Hibernate访问数据库。 我需要检索几个mio。来自数据库的行,以便正确显示它们。
初始问题:整个过程大约需要20-30秒
这不是非常人性化,所以我需要缩短时间! 我查看了漫长的等待时间来自哪里,它肯定是从DB接收的数据:当我想在MySQLWorkbench中使用纯SQL而不是Hibernate检索相同的数据时,它几乎需要相同的时间。
因此,后端的数据处理不是问题,它首先获取数据。
我尝试用多线程解决这个问题 我读到了使用多线程和hibernate的常见问题并试图避免它们,但我仍然觉得我忽略了一些重要的东西。
这是我到目前为止所尝试的内容:
在应该返回所有数据以供进一步处理的方法中我有
some code...
for(int i = 0; i <= numberOfThreads; i++) {
Runnable r = new Runnable() {
@Override
public void run() {
try{
someDataStructure = HibernateUtil.executeHqlCustom(hql,
lowerLimit, stepSize);
}catch(someException){
...
}
}
};
r.run();
r = null;
}
return someDataStructure;
“executeHqlCustom”创建会话,创建查询,使用 setFirstResult 设置下限并使用 setMaxResult 设置每个线程应该的数据量负责(这样就应该以块的形式收到数据) 会议结束。
我尝试了很多不同的组合(从DB的每一行中的几个线程到1个线程(我知道这很荒谬!)但是最后使用没有多线程总是比其他所有更快我刚才描述的选项。
我还尝试使用一个自己的类来实现Runnable / extends Thread,并将boolean标志作为实例变量,以便在不再需要时将线程设置为null。
这些都不是更好。
就像我说的,我99%肯定我忽略了一些非常重要的东西,或者我误解了多线程的一些概念(我对此很新)。
感谢任何帮助!