近期有个项目需要导入一千两百多万条数据,文件内容是每列以27的ascill值作为间隔符。把ascill转java如下:
假设表名是test_imp,要导入的字段有custno、custname、accno,要作为序号的字段名为seqno。文件内容格式:
一、在数据库建个序列:
create sequence test_imp_seq;
二、将该序列绑定到你要导入的表的那个字段,这样导入的时候每行数据序号字段值就会自动+1:
alter table test_imp alter column seqno set default nextval('test_imp_seq');
这样导入的时候就会自动序号自增了,当然,如果你要是想每次导入序号都从1开始,那么就在导入前可以执行下这个sql:
select setval('test_imp_seq',1,false);//false的意思是下一次nextval将返回该数值,随后的nextval才开始递增该序列,意思是设置为1,那么下次序号会是1开始,不加的话序号会是2开始。
三、导入
接下来就是具体导入了,导入的代码网上有很多,而我用的是postgresql驱动包的copyManager方法,将文件以流的方式入库,方法网上百度下就知道了,导入虽然不是我本次要说的内容,不过还是大致写下供参考(纯手敲的,敲错单词多担待):
Connection conn = null;
CopyManager copyManager = null;
BufferedReader br = null;
//获取连接,这个网上一大堆
conn = GaussDBUtil.getDBConnection();
//判断当前连接是不是PG连接
if(conn.isWrapperFor(PGConnection.class)){
System.out.println("PG连接");
//定义表信息
String tablename = "test_imp(custno,custname,accno)";
conn = (Connection) conn.unwrap(PGConnection.class);
copyManager = new copyManager ((BaseConnection)conn);
br = new BufferedReader (new InputStreamReader(new FileInputStream("/home/test/test.txt"),"UTF-8"));
copyManager.copyIn("COPY "+tablename + " FROM STDIN delimiter as '"+(char)(27)+"' NULL as 'null'",br);
br.close();//释放资源
GaussDBUtil.close(conn);//关闭连接,这个方法同样也是网上一大堆
}
经我本机真实测试,导入一千二百多万数据(每行32个字段,即32列)需二十分钟左右。
觉得有帮助到你的朋友点个赞哟(^U^)ノ~YO