public class OrderReadThread implements Runnable {
private List<Map<String, Object>> orderList;
private BaseDalClient dalClient;
private Map<String, Object> params;
private int totalRecords;
private CyclicBarrier cyclicBarrier;
@SuppressWarnings({ "rawtypes", "unchecked" })
@Override
public void run() {
// 每个线程分页查询,最终将结果放入公共的orderList
Page<?> pageInfo = dalClient.queryForListPage("eps.UserRegisterServiceImpl.selectOrderList", params,
totalRecords);
List tempList = pageInfo.getList();
orderList.addAll(tempList);
try {
// 子线程执行结束,等待其他未执行完的线程,如果所有线程都执行结束即执行同步线程
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
public void setOrderList(List<Map<String, Object>> orderList) {
this.orderList = orderList;
}
public void setDalClient(BaseDalClient dalClient) {
this.dalClient = dalClient;
}
public void setParams(Map<String, Object> params) {
this.params = params;
}
public void setTotalRecords(int totalRecords) {
this.totalRecords = totalRecords;
}
public void setCyclicBarrier(CyclicBarrier cyclicBarrier) {
this.cyclicBarrier = cyclicBarrier;
}
}
public class FileWriteTaskThread implements Runnable {
private List<Map<String, Object>> orderList;
public FileWriteTaskThread(List<Map<String, Object>> orderList) {
this.orderList = orderList;
}
@Override
public void run() {
System.out.println("****************将所有子线程统计的最终的结果保存到文件中F*******************");
String outFileName = "order" + getCurrentTimeStr() + ".txt";
String outFilePath = "d:/order/" + outFileName;
BufferedWriter bw = null;
try {
bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFilePath), "UTF-8"));
for (Map<String, Object> order : orderList) {
StringBuilder line = new StringBuilder(200);
line.append(MapUtils.getString(order, "b2corderno", "")).append(",")
.append(MapUtils.getString(order, "phonenum", "")).append(",")
.append(MapUtils.getString(order, "customername", "")).append(",")
.append(MapUtils.getString(order, "customeraddress", "")).append(",")
.append(MapUtils.getString(order, "suppliercode", ""));
bw.write(line.toString());
bw.newLine();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (bw != null) {
IOUtils.closeQuietly(bw);
}
}
}
private String getCurrentTimeStr() {
Date d = new Date();
SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
return format.format(d);
}
}
/**
* 每次查询1000条
*/
private static final int PERCENT_DOWNLOAD_NUM = 1000;
public static void main(String[] args) {
// 启动Spring容器
ApplicationContext context = new FileSystemXmlApplicationContext(
"file:src/main/webapp/WEB-INF/applicationContext.xml");
// 获取数据库操作类
BaseDalClient dalClient = context.getBean("dalClient", BaseDalClient.class);
// 查询总记录数
int totalRecords = dalClient
.queryForObject("eps.UserRegisterServiceImpl.selectOrderCount", null, Integer.class);
int temp = totalRecords / PERCENT_DOWNLOAD_NUM;
int queryCount = (totalRecords % PERCENT_DOWNLOAD_NUM) != 0 ? temp + 1 : temp;
List<Map<String, Object>> orderList = Collections.synchronizedList(new ArrayList<Map<String, Object>>());// 线程安全的List
// 同步辅助类,当所有子线程全部执行结束后来执行不同辅助类指定的同步线程FileWriteTaskThread
CyclicBarrier cyclicBarrier = new CyclicBarrier(queryCount, new FileWriteTaskThread(orderList));
for (int i = 1; i <= queryCount; i++) {
Map<String, Object> params = new HashMap<String, Object>();
params.put("pageSize", PERCENT_DOWNLOAD_NUM);
params.put("page", i);
OrderReadThread orderReadThread = new OrderReadThread();
orderReadThread.setDalClient(dalClient);
orderReadThread.setOrderList(orderList);
orderReadThread.setParams(params);
orderReadThread.setTotalRecords(totalRecords);
orderReadThread.setCyclicBarrier(cyclicBarrier);
// 启动多线程来从数据库中分页读取数据
Thread thread = new Thread(orderReadThread);
thread.start();
}
}
分享到:
相关推荐
数据库连接类型选择 Oracle数据库有专用服务器连接类型和多线程服务器MTS连接类型。对于批处理服 务,需要专用服务器连接方式,而对于OLTP服务则MTS的连接方式比较合适。由于采 用MTS后,可以通过配置网络服务实现...
3、**还有就是读数据库不用多线程读了,在等待数据返回的期间不会卡客户端,另外自己用多线程会引发冲突 4、**修复客户端退出后,在登录用户服务端崩溃问题。 [2020-2-23] ================ 1、**数据库读取增加...
易语言数据库中间件,采用远程服务支持库!暂时木有采用HP,因为HP我本身还不熟悉...6、软件内部采用类的形式进行数据库处理,内部进行临界处理,支持多线程! 7、备注详实,关键地方都有相关的说明,代码也算整齐吧!
项目基于Mysql自带的Sakila数据库实现了MIS系统中常用的多个功能,运行前请安装好Mysql8.0。 其中包含的内容如下: 1.Spring boot 2.1.6,Mybatis3.2.2的整合; 2.前端框架采用https://adminlte.io ,后台的分页...
再比如获取数据库序列,我们采用了统一的算法,不同的数据库都使用同一个接口来获取序列,而且这个方法可以在多线程环境下使用,甚至是集群环境下都没有问题。 5、提供多种使用方式。可以单独使用,也可以结合...
实例081 去掉字符串中的所有空格 101 实例082 汉字与区位码的转换 102 第5章 面向对象技术应用 103 5.1 Java中类的定义 104 实例083 自定义图书类 104 实例084 温度单位转换工具 105 实例085 域的默认初始化值 106 ...
如何使数据库中的表更有弹性,更易于扩展 存储过程——天使还是魔鬼 如何获取MSSQLServer,Oracel,Access中的数据字典信息 C#中利用GetOleDbSchemaTable获取数据库内表信息[原创] 如何解决ACCESS中SELECT TOP语句竟然...
18、一个用户表中有一个积分字段,假如数据库中有100多万个用户,若要在每年第一天凌晨将积分清零,你将考虑什么,你将想什么办法解决? 19、一个用户具有多个角色,请查询出该表中具有该用户的所有角色的其他用户。...
14.5.1 在数据库中对集合排序 14.5.2 在内存中对集合排序 14.6 映射组件类型集合 14.7 小结 14.8 思考题 第15章 映射实体关联关系 15.1 映射一对一关联 15.1.1 按照外键映射 15.1.2 按照主键映射 ...
14.5.1 在数据库中对集合排序 14.5.2 在内存中对集合排序 14.6 映射组件类型集合 14.7 小结 14.8 思考题 第15章 映射实体关联关系 15.1 映射一对一关联 15.1.1 按照外键映射 15.1.2 按照主键映射 ...
14.5.1 在数据库中对集合排序 14.5.2 在内存中对集合排序 14.6 映射组件类型集合 14.7 小结 14.8 思考题 第15章 映射实体关联关系 15.1 映射一对一关联 15.1.1 按照外键映射 15.1.2 按照主键映射 ...