【发布时间】:2014-10-08 17:22:37
【问题描述】:
我有 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();
}
有没有人对我可以做些什么来加快速度有任何建议?
【问题讨论】:
-
您确定在过程的第一部分(即从互联网获取文件)性能没有下降吗?
-
是否启用了自动提交?你是在每批之后还是最后提交?
-
绝对不是,我已经设置了抓取文件的计时器,最大的文件下载时间不到 5 秒。
-
禁用自动提交。使用单个事务插入所有内容。作为记录,我在 20 秒内插入了超过 100000 行,甚至没有使用批处理。
-
见 stackoverflow.com/questions/12206600/… 和 stackoverflow.com/q/758945/398670 。专门针对 Java 使用
CopyManager。
标签: java sql postgresql