【问题标题】:Loading data from Java to Postgresql very slow将数据从 Java 加载到 Postgresql 非常慢
【发布时间】: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


【解决方案1】:

尝试以下方法:

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

CopyManager copyManager = con.getCopyAPI();

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多