在做大数据量同步的时候,需要注意的内存使用问题,程序稍微控制不足,可能就会导致内存溢出等问题...在网上找了一些资料,发现大家都使用的如下方式:
1、先批量查询出所有数据,例子中是一万条一次
2、在查出数据后把每次的数据按一定的规则存入本地文件
3、读取文件数据时,可以采取单例模式,批量提交等方式操作数据库
代码如下:
Java代码
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;
}
文件操作方法如下:
Java代码
/**
* 新建文件(在原有文件内容上进行追加)
* 默认编码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一次性查询处理几百万数据解决方法 几百万数据是可以处理的 暂时还没试过几千万级的数据处理
java快速导出几十万百万生成DBF文件数据后台
封装了大数据DBF的读取、写入,并附有所使用javadbf.jar文件
该代码可以处理100万数据量的excel文件,xlsx文件数据量太大,用普通的读法会报内存溢出错误,所以用官网提供的方法,一条一条的读取大excel文件,本例子从这点出发,组装excel里读取的单条数据为list,在根据需求...
用于数据量大的情况下预先查询出数据,加快对后面页面数据的查询速度
java解决大批量数据导出Excel产生内存溢出的方案
java快速插入千万级数据,亲测91秒插入1700万数据!!!
30万的数据量,生成多个excel最后打包成zip下载,是工程,直接导入就行
JAVA 读取串口数据,推荐使用串口调试工具先测试成功在使用。
轻松解决普通poi形式导出Excel的中出现的栈溢出问题,此资源可实现千万级数据分批导出csv文件,测试实现16500000条数据大概80秒左右;具体表里内容。
最近由于项目需要,在已有java web工程里添加读取opc的接口类。通过接口将opc数据读取到本地存于oracle数据库中,供本管理系统趋势分析用。本实例在win7、xp系统本地均已调通。压缩包里有本人写的每一步详细说明操作...
java与c#MD5加密方法得到不一致解决办法,MD5加密后得到不一致结果
用java中的线程控制程序从一个数据库中定时自动抽取数据到另一个数据库,实现数据库的同步。代码很详细。
could not create the java virtual machine 解决办法,已亲自实践,放心使用
Java解析大数据量Excel,支持解析百万行excel数据,十万数据基本上十来秒就解析完毕,亲测过最大excel1048576行数据用时219秒,硬件好点的PC估计跑起来更快。
主要为大家详细介绍了java导出大批量即百万以上数据的excel文件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
由于项目需要对大量Excel数据进行输入输出处理,在使用JXL,POI后发现很容易出现OOM,最后在网上找到阿里的开源...经过大量的调试优化,现通过JAVA生成104万行20列的数据并写入到Excel文件的Sheet中只需要70秒的时间。
Java版的数据结构,对于Java爱好者而言,是一个不错的选择
内部java实现多个数据库,保持数据同步案例。
java csv大数据量导出(千万级别,不会内存溢出),多线程导出 ,生产环境已经很稳定的使用着