在做大数据量同步的时候,需要注意的内存使用问题,程序稍微控制不足,可能就会导致内存溢出等问题...在网上找了一些资料,发现大家都使用的如下方式:
1、先批量查询出所有数据,例子中是一万条一次
2、在查出数据后把每次的数据按一定的规则存入本地文件
3、读取文件数据时,可以采取单例模式,批量提交等方式操作数据库
代码如下:
public boolean createUploadFileByAll() { boolean flag = false; int onerun = 10000; // 每次读取记录数 int lastrow = 0; // 每次读取后的最后一条记录 ResultSet rs = null; Statement stat = null; try { String hql = "SELECT count(*) FROM T_jgdm"; int datanum = ((Long) this.getSession().createQuery(hql).uniqueResult()).intValue(); int runnum = datanum % onerun == 0 ? (datanum / onerun) : (datanum / onerun) + 1; // 分批读取数据 conn = getConn(); stat = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); StringBuffer text = new StringBuffer(); text.append("机构代码(JGDM)-").append("机构名称(JGMC)-").append("首次办证日期(SCBZRQ)-"); text.append("外经委填表人(WJWTBR)-").append("可否公开(GK)-").append("发卡标志(FKBZ)-"); text.append("发卡数量(FKSL)-").append("打印标志(DYBZ)-").append("电邮地址(EMAIL)-"); text.append("网址(URL)-").append("最后修改日期(LASTDATE)-").append("操作标志(CZFLAG)-"); text.append("是否邮寄(YJFLAG)-").append("数据状态(SJZT)-").append("检验结果(JYJG)-"); text.append("分值(FZ)-").append("作废日期(ZFRQ)-").append("办证机构区划代码(BZJGDM)-"); text.append("变更日期(BGRQ)-").append("年检日期(NJRQ)-").append("年检期限(NJQX)-"); text.append("迁址日期(QZRQ)-").append("开户银行(KHYH)-").append("开户账号(KHZH)\r\n"); // 文件列注解 \r\n为换行符 for (int r = 0; r < runnum; r++) { System.out.println("createUploadFileByAll--" + datanum + " 开始查询第" + (r + 1) + "批数据"); String sql = "SELECT *\n" + " FROM (SELECT rownum rn, " + QUERY_FIELD + " FROM t_jgdm ORDER BY rownum ASC)\n" + " WHERE rn > " + lastrow; stat.setMaxRows(onerun); stat.setFetchSize(1000); // 当调用rs.next时,ResultSet会一次性从服务器上取1000行数据回来,在下次rs.next时,它可以直接从内存中获取出数据而不需要网络交互,从而提高效率 rs = stat.executeQuery(sql); // 生成文件 int i = 1; while (rs.next()) { String jgdm = rs.getString("JGDM"); String jgmc = rs.getString("JGMC"); String scbzrq = rs.getString("SCBZRQ"); String wjwtbr = rs.getString("WJWTBR"); String gk = rs.getString("GK"); String fkbz = rs.getString("FKBZ"); String fksl = rs.getString("FKSL"); String dybz = rs.getString("DYBZ"); String email = rs.getString("EMAIL"); String url = rs.getString("URL"); String lastdate = rs.getString("LASTDATE"); String czflag = rs.getString("CZFLAG"); String yjflag = rs.getString("YJFLAG"); String sjzt = rs.getString("SJZT"); String jyjg = rs.getString("JYJG"); String fz = rs.getString("FZ"); String zfrq = rs.getString("ZFRQ"); String bzjgdm = rs.getString("BZJGDM"); String bgrq = rs.getString("BGRQ"); String njrq = rs.getString("NJRQ"); String njqx = rs.getString("NJQX"); String qzrq = rs.getString("QZRQ"); String khyh = rs.getString("KHYH"); String khzh = rs.getString("KHZH"); text.append(StringUtil.isNotEmpty(jgdm) ? jgdm : " ").append("^^^^"); text.append(StringUtil.isNotEmpty(jgmc) ? jgmc : " ").append("^^^^"); text.append(StringUtil.isNotEmpty(scbzrq) ? scbzrq : " ").append("^^^^"); text.append(StringUtil.isNotEmpty(wjwtbr) ? wjwtbr : " ").append("^^^^"); text.append(StringUtil.isNotEmpty(gk) ? gk : " ").append("^^^^"); text.append(StringUtil.isNotEmpty(fkbz) ? fkbz : " ").append("^^^^"); text.append(StringUtil.isNotEmpty(fksl) ? fksl : "").append("^^^^"); text.append(StringUtil.isNotEmpty(dybz) ? dybz : " ").append("^^^^"); text.append(StringUtil.isNotEmpty(email) ? email : " ").append("^^^^"); text.append(StringUtil.isNotEmpty(url) ? url : " ").append("^^^^"); text.append(StringUtil.isNotEmpty(lastdate) ? lastdate : "").append("^^^^"); text.append(StringUtil.isNotEmpty(czflag) ? czflag : " ").append("^^^^"); text.append(StringUtil.isNotEmpty(yjflag) ? yjflag : " ").append("^^^^"); text.append(StringUtil.isNotEmpty(sjzt) ? sjzt : " ").append("^^^^"); text.append(StringUtil.isNotEmpty(jyjg) ? jyjg : " ").append("^^^^"); text.append(StringUtil.isNotEmpty(fz) ? fz : " ").append("^^^^"); text.append(StringUtil.isNotEmpty(zfrq) ? zfrq : " ").append("^^^^"); text.append(StringUtil.isNotEmpty(bzjgdm) ? bzjgdm : " ").append("^^^^"); text.append(StringUtil.isNotEmpty(bgrq) ? bgrq : " ").append("^^^^"); text.append(StringUtil.isNotEmpty(njrq) ? njrq : " ").append("^^^^"); text.append(StringUtil.isNotEmpty(njqx) ? njqx : " ").append("^^^^"); text.append(StringUtil.isNotEmpty(qzrq) ? qzrq : " ").append("^^^^"); text.append(StringUtil.isNotEmpty(khyh) ? khyh : " ").append("^^^^"); text.append(StringUtil.isNotEmpty(khzh) ? khzh : " ").append("^^^^\r\n"); if (i % 1000 == 0) { // 创建文件,并追加内容 FileOperate fileOperate = FileOperate.getFileOperate(); fileOperate.createFileByAddTo(UPLOAD_TEMP_FILE_NAME_BY_ALL, text.toString()); text = new StringBuffer(""); } i++; } // 向文件中追加不能被1000求余的内容 if (text.length() > 10) { FileOperate fileOperate = FileOperate.getFileOperate(); fileOperate.createFileByAddTo(UPLOAD_TEMP_FILE_NAME_BY_ALL, text.toString()); } lastrow += onerun; } rs.close(); stat.close(); conn.close(); flag = true; } catch (Exception e) { flag = false; e.printStackTrace(); } return flag; }
文件操作方法如下:
/** * 新建文件(在原有文件内容上进行追加) * 默认编码UTF-8 * @param filePathAndName * @param fileContent */ public void createFileByAddTo(String filePathAndName, String fileContent) { try { File file = new File(filePathAndName); BufferedWriter bw = null; try { bw = new BufferedWriter(new FileWriter(file, true)); // 参数true表示向文件中追加内容 bw.write(fileContent); bw.close(); } catch (IOException e) { e.printStackTrace(); } } catch (Exception e) { System.out.println("新建文件(在原有文件内容上进行追加)出错:"); e.printStackTrace(); } }
相关推荐
本项目“java快速导出几十万百万生成DBF文件数据后台”主要关注如何使用Java编程语言高效地处理大规模数据,将其导出为DBF文件格式。 首先,我们需要了解Java处理大量数据的基本策略。在Java中,处理大数据的关键...
在实际的软件开发过程中,尤其是在处理大量数据时,如何高效地进行数据查询成为了一个关键问题。例如,在一个用户众多的社交平台上,当用户需要查看自己的动态列表时,如果每次都是实时查询数据库并返回所有数据,...
总的来说,"Java Mybatis Maven多线程处理百万数据修改的小工具"项目展示了如何巧妙地结合Mybatis的灵活性和Java的多线程能力,来解决大数据量处理的难题。这种解决方案对于处理大数据场景的企业级应用具有很高的...
1. **数据分页**:根据数据库查询能力,设定合适的分页大小,如10000条或20000条,避免一次性取出过多数据。 2. **流式处理**:使用Java的BufferedWriter类进行流式写入,每批数据读取后立即写入文件,减少内存占用...
该代码可以处理100万数据量的excel文件,xlsx文件数据量太大,用普通的读法会报内存溢出错误,所以用官网提供的方法,一条一条的读取大excel文件,本例子从这点出发,组装excel里读取的单条数据为list,在根据需求...
java快速插入千万级数据,亲测91秒插入1700万数据!!!
Java 读取串口数据是Java编程中一个重要的部分,特别是在物联网(IoT)设备通信、嵌入式系统以及工业自动化等领域。RXTX库是一个流行的开源Java库,用于实现与串行端口(COM口)和并行端口的交互。在本教程中,我们将...
传统的Apache POI库在处理大规模数据时可能会遇到栈溢出(StackOverflowError)和内存溢出(OutOfMemoryError)等问题,因为这些库将所有数据加载到内存中一次性处理。为了解决这些问题,我们可以采用分批导出和多...
### Java处理100万行超大Excel文件秒级响应 #### 一、问题背景与需求分析 在项目开发过程中,经常会遇到需要处理大量Excel数据的情况。这些数据可能包括成千上万条记录,每条记录又包含多个字段。传统的处理方式...
在IT行业中,数据库同步是一个关键话题,特别是在分布式系统和企业级应用中,多个数据库的同步是确保数据一致性、完整性和高可用性的重要手段。本文将深入探讨如何使用Java来实现多个数据库之间的数据同步。 首先,...
4. **Dynamic Loading Data**:动态加载数据意味着在用户交互时,数据不是一次性全部加载,而是按需加载。这可以提高应用性能,特别是在处理大量数据时。可以使用懒加载策略,只有当用户滚动到新数据或请求更多数据...
java与c#MD5加密方法得到不一致解决办法,MD5加密后得到不一致结果
在IT领域,网络数据抓取是一项重要的技能,特别是在大数据分析、搜索引擎优化和市场研究中。本文将详细讨论如何使用Java语言来抓取网页数据,包括两种主要方法:直接抓取原网页内容和处理网页中的JavaScript返回数据...
Kettle 是一个开源的 ETL 工具,纯 Java 编写,绿色无需安装,数据抽取高效稳定。Kettle 中有两种脚本文件,transformation 和 job,transformation 完成针对数据的基础转换,job 则完成整个工作流的控制。Kettle 的...
KMeans聚类是一种广泛应用的无监督机器学习算法,主要用于数据的分类...通过理解和实践Java中的KMeans,我们可以更好地理解和应用这一算法,解决实际问题。同时,测试和分析结果是验证算法有效性和优化模型的关键环节。
《Java数据结构(Java版)(第3版)》是由叶核亚编著的一本针对Java程序员深入理解数据结构的经典教材。这本书详细介绍了如何在Java编程环境中应用各种数据结构,帮助读者提升算法设计和问题解决能力。以下是该书...
rxtx java获取电子称重量数据完整版 最近因为要弄一个网页获取电子称重量的功能,所以去查看了这方面的资料,找了许多人的资料,看了许多。这个对于我来说本来就是新东西,更加不懂。所以这个东西对于新手很适合,...
在IT领域,尤其是在Java编程中,数据结构和算法是核心基础,它们对于开发高效、优化的软件至关重要。本文将深入探讨这些主题,并结合面试题,帮助你提升技能和准备面试。 首先,我们要理解数据结构。数据结构是组织...
本文将深入探讨如何使用Java实现RTSP数据的拆包组帧,并将其转换为H264数据帧。 首先,理解RTSP数据的传输过程至关重要。RTSP通过TCP或UDP传输RTP(实时传输协议)数据包,每个RTP包通常包含一个或多个连续的视频帧...
这个项目源自于http://blog.csdn.net/suhenhappy/article/details/7991236,这篇博客,在此谢谢博主suhenhappy。实现了java导出数据到指定的excel模板中。