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));