将数据从Java加载到Postgresql非常慢

时间:2014-08-14 22:26:52

标签: java sql postgresql

我有26个CSV文件,我想每晚从互联网上获取并上传到Postgresql表中。我使用Java,PreparedStatement和Batch工作。尽管如此,性能却非常缓慢。要获取6000个左右的条目并将它们放入Postgresql,它需要30分钟。这是我第一次做这样的事情,所以我没有确切地知道这是快还是慢的参考点。

要获取该文件,我正在使用此代码。

URL grabberUrl = new URL(csvUrl);
URLConnection grabberConn = grabberUrl.openConnection();
BufferedReader grabberReader = new BufferedReader(new InputStreamReader(grabberConn.getInputStream())); 

然后我使用PreparedStatement并从输入流中获取值并设置它们

con = DriverManager.getConnection(url, user, password);
pst = con.prepareStatement("insert into blah(name, year) values(?, ?)");
pst.setString(1, name);
pst.setString(2, year);

然后我正在批量插入。我尝试过从100到1000的值,但没有对性能进行任何有意义的改变。

pst.addBatch();

if (count == 100) { 
count = 0;
pst.executeBatch(); 
}

有没有人对我能做些什么来加快速度有任何建议?

2 个答案:

答案 0 :(得分:1)

如果您可以从PostgreSQL服务器访问文件,请尝试使用copy语句。见链接 http://www.postgresql.org/docs/9.3/static/sql-copy.html

此外,如果您知道数据质量,则可以临时删除任何表约束并删除任何索引。您可以在加载数据后添加约束和索引。

答案 1 :(得分:1)

尝试以下方法:

PGConnection con = (PGConnection) DriverManager.getConnection(...);

CopyManager copyManager = con.getCopyAPI();

copyManager.copyIn("copy mytable from stdin with (format csv)", grabberReader);

如果mytable被严重索引,则删除索引,加载并重新创建索引。