对于复杂的业务sql查询,可以考虑如下建议。
1.先通过sql查询出主表信息列表list.
2.for循环list,补充查询主表对应的子表信息。
3.在2的步骤中,可以使用多线程处理for查询。
可以参考如下:
其中conList 是查询主表返回的list
//线程池初始化
ThreadPoolExecutor executor = ThreadPool.getThreadPool(5,8, 3000, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(2000));
//得到线程池中线程队列
LinkedBlockingQueue<Runnable> queue = (LinkedBlockingQueue<Runnable>) executor.getQueue();
int countTool= conList.size();
final CountDownLatch countDownLatch = new CountDownLatch(countTool);
for(int i=0;i < countTool;i++){
final Map tempMap = (Map) conList.get(i);
String contractNo = (String) tempMap.get("CONTRACTNO");
String workflowId = (String) tempMap.get("WORKFLOWID");
params.put("WORKFLOWID", workflowId); //工作流
final IbatisDao dao=new IbaitsDaoImpl();
//防止 params 被重复引用 需要重新 new 对象 并使用该new 对象
final Map myParam = new HashMap();
myParam.putAll(params);
//向线程池 放入待处理的任务信息 使用内部类进行 查询
executor.execute(new Runnable(){
public void run() {
//统计审核次数
try {
Map auditMap = (Map) dao.queryObjectBySql("QUERY_AUDIT_NUM_BY_WORKFLOWID",myParam);
tempMap.put("AUDITNAME",auditMap.get("AUDITNAME"));
tempMap.put("AUDITNUM",auditMap.get("AUDITNUM"));
//查询审核时间
auditMap = (Map) dao.queryObjectBySql("QUERY_AUDIT_TIME_BY_WORKFLOWID",myParam);
tempMap.put("AUDITTIME",auditMap.get("AUDITTIME"));
} catch (SQLException e) {
e.printStackTrace();
}
//线程计数器 减 1
countDownLatch.countDown();
}
});
}
//所有子线程 执行完成之后 主线程再继续向下
countDownLatch.await();
System.out.println("-------------query end------");
?
分享到:
相关推荐
好,下面我就为大家介绍一种方法:构建SQL池,分离业务逻辑层和数据访问层,让业务逻辑层从低效的数据库操作解脱,以提高系统整体性能。 (一)SQL池 SQL池是SQL容器,用于存放业务逻辑层抛过来的SQL语句。SQL池主要...
我们设计了一种全新的机制并应用了多线程,因此您可以并行运行某些任务以提高数据库开发的整体效率。 管理本地和云数据库,例如Amazon RDS,Amazon Aurora,Amazon Redshift,Microsoft Azure,Oracle Cloud,Google...
NET平台提供大量的服务,包括垃圾自动收集、面向对象的多线程、基于程序集的部署、 异常处理、特性编程、远程处理、ASP.NET网页框架、互操作、安全性等,使开发人员可 以快速构架任何企业级应用及解决方案,从包括...
我们设计了一种全新的机制并应用了多线程,因此您可以并行运行某些任务以提高数据库开发的整体效率。 云数据库导航 管理本地和云数据库,例如Amazon RDS,Amazon Aurora,Amazon Redshift,Microsoft Azure,...
注意:该参数值设置的过大反而会是服务器整体效率降低 ft_min_word_len = 4 # 分词词汇最小长度,默认4 transaction_isolation = REPEATABLE-READ # MySQL支持4种事务隔离级别,他们分别是: # READ-UNCOMMITTED, ...
15.2.5提高内存的访问效率 15.3 RAC Database 15.3.1 Oracle版本 15.3.2数据表空间的调整 15.3.3 DML语句性能调整 15.3.4临时表空间的调整 15.3.5日志文件的调整 15.3.6 UNDO表空间的调整 15.4应用系统 ...
与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。...
与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。...
Java的产生与流行是当今Internet发展的客观要求,Java是一门各方面性能都很好的编程语言,它的基本特点是简单、面向对象、分布式、解释的、健壮的、安全的、结构中立的、可移植的、性能很优异的、多线程的、动态的,...
在 SQL Server 2005 中查询表结构及索引 sql server 2005中的DDL触发器 在 SQL Server 2005 中使用表值函数来实现空间数据库 SQL Server 2005的30个最重要特点 同时安装sql2000和sql2005的经验 类如何与界面绑定 在...
Java的产生与流行是当今Internet发展的客观要求,Java是一门各方面性能都很好的编程语言,它的基本特点是简单、面向对象、分布式、解释的、健壮的、安全的、结构中立的、可移植的、性能很优异的、多线程的、动态的,...
主要是介绍各种格式流行的软件设计模式,对于程序员的进一步提升起推进作用,有时间可以随便翻翻~~ 23种设计模式汇集 如果你还不了解设计模式是什么的话? 那就先看设计模式引言 ! 学习 GoF 设计模式的重要性 ...