JDBCファイルにデータを書き込みpostgresqlにコピー
4026 ワード
テストの結果、約12万件のデータが2秒+程度書き込まれた.
コードは次のとおりです.
そして、COPYが完了したら必ずファイルを削除してください.
ファイルのコードを削除するには:
また、エピソードをもう一つ記録します.
なんと、最大3000本のデータ(100*30)を挿入すると、時間が長くなり、ディスクIOが高くなるという表があります.私のめがねは地面に落ちて割れそうになって、一度は平行宇宙に入ったのではないかと疑った.
後で見ると、テーブルにはプライマリ・キー制約があり、書き込まれたデータにはプライマリ・キーというフィールドが含まれています.つまり、書き込まれたデータ・データベースごとに一意性を検出する必要があります.当時、表のデータは600 w+本だった.なぜ入庫速度がこんなに遅いのか疑う必要はありません.
一方、プライマリ・キー・フィールド自体がUUIDを使用して生成された(NIC+ミリタイムスタンプ+乱数)は、絶対的に一意性を保証するため、データベースが一意性を保証する必要はありません.制約を外して、入庫速度で飛行機に乗りました.
コードは次のとおりです.
package com.nsfocus.bsaips.main;
import com.alibaba.fastjson.JSONObject;
import com.nsfocus.bsaips.util.RemoteDBUtil;
import org.postgresql.copy.CopyManager;
import org.postgresql.core.BaseConnection;
import java.sql.*;
import java.util.ArrayList;
import java.io.*;
import java.util.List;
import java.util.UUID;
public class Test {
public String writeFile(List<JSONObject> list){
FileWriter out = null;
String filePath = "/tmp/"+UUID.randomUUID();
try{
out = new FileWriter(new File(filePath));
for(int i=0;i<list.size();i++){
Object[] objs = list.get(i).values().toArray();
for(int j=0;j<objs.length;j++){
if(objs[j] == null){
out.write("null");
}else{
out.write(String.valueOf(objs[j]));
}
if(j != objs.length - 1){
out.write(",");
}
}
if(i != list.size() - 1){
out.write("
");
}
}
out.flush();
}catch(Exception ex){
ex.printStackTrace();
}finally{
if(out != null){
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return filePath;
}
public void copyTest(String tablename,List<JSONObject> list){
Connection conn = null;
CopyManager copyManager = null;
FileReader reader = null;
try{
long starttime = System.currentTimeMillis();
String filePath = writeFile(list);
conn = RemoteDBUtil.getInstance("ip",5432,"dbname","username","password").getConnection();
copyManager = new CopyManager((BaseConnection)conn);
reader = new FileReader(new File(filePath));
copyManager.copyIn("copy "+tablename+" from stdin delimiter as ',' NULL as 'null'",reader);
long endtime = System.currentTimeMillis();
System.out.println(endtime-starttime);
}catch(Exception ex){
ex.printStackTrace();
}finally{
if(reader != null){
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args){
List<JSONObject> list = new ArrayList<JSONObject>();
for(int i=0;i<120000;i++){
JSONObject jsonObject = new JSONObject();
jsonObject.put("id",i);
jsonObject.put("testname","aaaa");
list.add(jsonObject);
}
new Test().copyTest("copytest", list);
}
}
そして、COPYが完了したら必ずファイルを削除してください.
ファイルのコードを削除するには:
File file = new File(filePath);
if(file.exists()){
file.delete();
}
また、エピソードをもう一つ記録します.
なんと、最大3000本のデータ(100*30)を挿入すると、時間が長くなり、ディスクIOが高くなるという表があります.私のめがねは地面に落ちて割れそうになって、一度は平行宇宙に入ったのではないかと疑った.
後で見ると、テーブルにはプライマリ・キー制約があり、書き込まれたデータにはプライマリ・キーというフィールドが含まれています.つまり、書き込まれたデータ・データベースごとに一意性を検出する必要があります.当時、表のデータは600 w+本だった.なぜ入庫速度がこんなに遅いのか疑う必要はありません.
一方、プライマリ・キー・フィールド自体がUUIDを使用して生成された(NIC+ミリタイムスタンプ+乱数)は、絶対的に一意性を保証するため、データベースが一意性を保証する必要はありません.制約を外して、入庫速度で飛行機に乗りました.