论坛首页 入门讨论版

java批量插入数据的问题(数据库是sqlserver)

浏览 2662 次
该帖已经被评为新手帖
作者 正文
最后更新时间:2007-10-22 关键字: Java
现在有个需求是需要读文件中的数据一次性写入数据库中,我现在的处理办法是:先将文件中的数据

读入一个ArrayList,然后循环用jdbc的批处理插入表中,数据量小的时候没问题。可是当数据达到20万时

就会插入失败。现在急需要改进,希望各位能给个好的思路,谢谢各位!
   
最后更新时间:2007-10-22
分匹。。。
一次500条。。。
每次之后commit一下
   
0 请登录后投票
最后更新时间:2007-10-22
谢谢回复,能说的详细一点吗?批次是写一个事务吗?
   
0 请登录后投票
最后更新时间:2007-10-22
数据量小的时候没问题
那么大小的区别是什么?
commit之前是把这些放在内存里,
数据量大了溢出了。
所以每作一些就commit一下。
   
0 请登录后投票
最后更新时间: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万,这样问或许有点太依赖别人,但是比较急,请原谅!
   
0 请登录后投票
最后更新时间:2007-10-22
异常也有今天...............
   
0 请登录后投票
最后更新时间:2007-10-22
批处理分批execute,事务的commit还是只有一次。
   
0 请登录后投票
最后更新时间: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个小时过去了。
   
0 请登录后投票
最后更新时间:2007-10-22
异常的代码是用来做什么的?
这是批量执行么?
   
0 请登录后投票
最后更新时间:2007-10-22
         while(start<list.size()){  
             start = db.oneBatch(start,1000,list);  
         }  

把200000条记录分成1000条一次
   
0 请登录后投票
论坛首页 入门讨论版

跳转论坛:
JavaEye推荐