我有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();
}
有没有人对我能做些什么来加快速度有任何建议?
答案 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被严重索引,则删除索引,加载并重新创建索引。