Java 使用SpringBoot和hibernate执行多个不同的查询
我的要求是创建多个线程并执行查询,并给出最终输出,如Java 使用SpringBoot和hibernate执行多个不同的查询,java,multithreading,spring-boot,Java,Multithreading,Spring Boot,我的要求是创建多个线程并执行查询,并给出最终输出,如Map 映射包含表名字符串,List是包含表记录列表的查询输出 要求: 我有一个表,其中包含字段列表,如TableName和Query 例如 雇佣|从雇佣中选择*;该查询有超过100000条记录 使用详细信息|从使用详细信息中选择*;该查询有超过300000条记录 雇佣薪资|从雇佣薪资中选择*;该查询有超过600000条记录 上表可能有10000个查询 我想使用SpringBoot+hibernate为上述查询创建一个API 我的问题: 我
Map代码>
映射包含表名字符串,List
是包含表记录列表的查询输出
要求:
- 我有一个表,其中包含字段列表,如TableName和Query
例如
雇佣|从雇佣中选择*;该查询有超过100000条记录
使用详细信息|从使用详细信息中选择*;该查询有超过300000条记录
雇佣薪资|从雇佣薪资中选择*;该查询有超过600000条记录
上表可能有10000个查询
我想使用SpringBoot+hibernate为上述查询创建一个API
我的问题:
我想使用Java8创建一个具有多线程的解决方案
@RestController
public class ApiQueries {
@RequestMapping(value = "/getAllQueries", method = RequestMethod.GET)
public CommonDTO getAllQuery(){
list=apiQueryService.findAll();
if(null!=list){
objectMap= apiQueryService.executeQueryData(list); //here apiQueryService have one method named is executeQuery()
}
}
}
我用那个方法写了下面的逻辑
@Override
public Map<String,List<Object>> executeQueryData(List<ApiQueries>
apiQuerylist, String fromDate, String toDate) {
addExecutor = new ThreadPoolExecutor(3, 5, 10, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>());
List<Object> obj=null;
Map<String,List<Object>> returnMap=new HashMap<String,List<Object>>();
try {
if(session==null) {
session = sessionFactory.openSession();
}
apiQuerylist.forEach(list-> addExecutor.execute(new Runnable() {
@Override
public void run() {
apiQueryObject = session.createSQLQuery(list.getQuery()).list();
returnMap.put(list.getTableName(), apiQueryObject);
}
}));
}catch(Exception ex) {
System.out.println("Inside [B] Exception "+ex);
ex.printStackTrace();
}finally {
if(session !=null) {
session.close();
}
}
return returnMap;
}
您需要等待线程池完成。在apiQuerylist.forEach
之后,下面类似的内容应该可以工作:
addExecutor.shutdown();
// waiting for executors to finish their jobs
while (!addExecutor.awaitTermination(50, TimeUnit.MILLISECONDS));
谢谢,我将尝试ConcurrentHashMap。no creatSqlQuery不会返回空值实际上问题是当我开始调试时,光标位于apiQuerylist.forEach(list->addExecutor.execute(new Runnable())行上它将在后台执行,游标将转移到foreach循环,这就是它返回空映射的原因。不解决,我将尝试使用ConcurrentHashMap,但问题仍然存在
addExecutor.shutdown();
// waiting for executors to finish their jobs
while (!addExecutor.awaitTermination(50, TimeUnit.MILLISECONDS));