|
该帖已经被评为新手帖
|
|
|---|---|
| 作者 | 正文 |
|
最后更新时间:2007-10-22 关键字: Java
现在有个需求是需要读文件中的数据一次性写入数据库中,我现在的处理办法是:先将文件中的数据
读入一个ArrayList,然后循环用jdbc的批处理插入表中,数据量小的时候没问题。可是当数据达到20万时 就会插入失败。现在急需要改进,希望各位能给个好的思路,谢谢各位! 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
最后更新时间:2007-10-22
分匹。。。
一次500条。。。 每次之后commit一下 |
|
| 返回顶楼 | |
|
最后更新时间:2007-10-22
谢谢回复,能说的详细一点吗?批次是写一个事务吗?
|
|
| 返回顶楼 | |
|
最后更新时间:2007-10-22
数据量小的时候没问题
那么大小的区别是什么? commit之前是把这些放在内存里, 数据量大了溢出了。 所以每作一些就commit一下。 |
|
| 返回顶楼 | |
|
最后更新时间:2007-10-22
DBConnect conn = null;
try {
conn = new DBConnect();
conn.prepareStatement("insert into sendsm (sSrcTermID,sChargeTermID,sDestTermID,nMsgLen,sMsgContent) VALUES (?,?,?,?,?)");
for (int i = 0; i < list.size(); i++) {
conn.setString(1, sSrcTermID);
conn.setString(2, (String) list.get(i));
conn.setString(3, (String) list.get(i));
conn.setInt(4, msg.getBytes().length);
conn.setString(5, msg);
//把一个SQL命令加入命令列表
conn.addBatch();
}
//执行批量更新
conn.executeBatch();
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
try {
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return true;
方法如上,按您说的,那么应该怎么修改呢,比如20万条数据,每次commit1万,这样问或许有点太依赖别人,但是比较急,请原谅! |
|
| 返回顶楼 | |
|
最后更新时间:2007-10-22
异常也有今天...............
|
|
| 返回顶楼 | |
|
最后更新时间:2007-10-22
批处理分批execute,事务的commit还是只有一次。
|
|
| 返回顶楼 | |
|
最后更新时间:2007-10-22
package com.fengchunhua.sqltools;
import java.net.ConnectException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class LotofMemoneyListInsertIntoDB {
private static Connection conn = JDBCConnectTools.getMySQLConnection();
private static String sql = "insert into typetest (id,name,tid) VALUES (?,?,?)";
/**
* @param args
* @throws SQLException
*/
public static void main(String[] args) throws SQLException {
Date date = new Date();
List list = new ArrayList();
for(int i = 0 ; i < 200000;i++){
list.add(""+(i*3));
}
LotofMemoneyListInsertIntoDB db = new LotofMemoneyListInsertIntoDB();
int start = 0;
while(start<list.size()){
start = db.oneBatch(start,1000,list);
}
conn.close();
System.out.println(((new Date()).getTime()-date.getTime())/1000);
}
public void getConn(Connection conn){
this.conn = conn;
}
public int oneBatch(int start,int times,List list) throws SQLException{
PreparedStatement ps = conn.prepareStatement(sql);
for(int i=start;i<times+start&&i<list.size();i++){
ps.setInt(1, i);
ps.setString(2, (String) list.get(i));
ps.setString(3, (String) list.get(i));
ps.execute();
}
return times+start;
}
}
近年来写过的最恶心的代码 有没有人能帮忙重构一下。 另写一下测试代码。 真不知道怎么写这样的测试代码 已经进行了55830条,1个小时过去了。 |
|
| 返回顶楼 | |
|
最后更新时间:2007-10-22
异常的代码是用来做什么的?
这是批量执行么? |
|
| 返回顶楼 | |
|
最后更新时间:2007-10-22
while(start<list.size()){
start = db.oneBatch(start,1000,list);
}
把200000条记录分成1000条一次 |
|
| 返回顶楼 | |








