欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

hibernate 处理百万级 数据

程序员文章站 2022-04-21 22:25:56
...
好些天了吧,没有写了!今天闲了,正好这两天也有收获特此一记!
先说需求吧,现在有这样一个文件,是txt 里面全部是纯数据。。。

数据格式如下:

01,02,03,04,05,06
02,03,04,05,06,07
03,04,05,06,07,08
.......
只有这一列。。。。也许第一行有可能重复 N 次 ,现在客户需要 找到这些数据里面每一组

数据只出现一次的.。 看到这里 也许 你已经有办法了,说用sql 语句直接查询统计就出来了

是的!你的想法是正确的,但是对于一个24M 的 txt 文件。。你如何让这些纯数据 添加到数据

库呢? 还有就是需求也还需要去查询 还有导出(txt格式 还是这个格式)!!!


先说我的思路:关于到读取文件 那就要用到IO 了。。。这里因为就只有一列数据而且每一列数据是一行所以我当时想到的就是使用 FileReader 调用里面的readLine() 方法

这样每次都能读取一行!!!

来看一段代码:

vo:

public class RedBall {

private long id;
private String redValue;
public RedBall(){}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getRedValue() {
return redValue;
}
public void setRedValue(String redValue) {
this.redValue = redValue;
}
}

很简单 就是这样一个vo

接下俩看主要的东西 我是用了hibernate


public boolean save() throws IOException{
boolean flag = false;
Session session = sf.openSession();
tx = session.beginTransaction();
int i = 0;
if(!deleteDB()){
return flag;
}else{
try{
Reader reader = new FileReader("d:/Data.txt");
BufferedReader br = new BufferedReader(reader);
String temp = null;
while((temp=br.readLine()) != null){
RedBall redBall = new RedBall();
redBall.setRedValue(temp);
insertDB(redBall,session);
i++;
[color=red][i][b]if(i%10000 == 0){
session.flush();
session.clear();
}[/b][/i][i][/i][/color]
}
flag = true;
tx.commit();
session.close();
}catch(Exception e){
flag = false;
tx.rollback();
session.close();
}
}
return flag;
}


请注意这里的红色字体!这是我修改只有的代码,到这里我说一下之前我的处理

我之前是吧tx.commit();session.close();放在insertDB(redBall,session); 这个方法里面的,结果效率 可想而知!!!

后来我仔细地想了想原因 觉得应该放在外面就像批量处理数据一样 这样的话 效率提高了。

之前呢 我没事做一个判断的if(i%10000 == 0) 有人可能会问你这么做是为了干什么?

我个人认为如果我们不清理内存呢中的数据 那么内存会溢出!事实证明了我的想法!

就要这么处理!这样一来 效率上来了 而且 内存溢出也解决了!!!

但是这样貌似还有点慢,我google 了一把发现完全可以通过一条sql 语句来吧文件导入到数据库表中的 (其实我用的数据库书mysql) ,当然这后来我发现的!

最后看一下使用数据库导入的代码:


Session session = sf.openSession();
tx = session.beginTransaction();
String hql = " load data local infile 'E:/XXX.txt' into table Insert_database fields terminated by '\t' lines terminated by '\r\n'";
Query query = session.createSQLQuery(hql);
try{
query.executeUpdate();
tx.commit();
session.close();
flag = true;

}catch(Exception e){
tx.rollback();
session.close();
}


这样的话文件的导入就很快了!!!但是我在想加入数据库 都不支持这种做法不知道有没有更好的方法去从一个txt中读出来元数据 并写入到数据库中!!!
相关标签: txt sql