【问题标题】:Optimize writes to heroku Postgresql database优化对 heroku Postgresql 数据库的写入
【发布时间】:2014-09-06 07:51:13
【问题描述】:

我们正在处理大量使用 Talend 处理的传入事件,然后将它们推送到不同的 postgresql 数据库(本地和远程 heroku db)中。由于会话选项 setAutoCommit(true) 我们面临着巨大的性能损失,尤其是在 heroku 数据库上(每个语句/插入都是必须提交的新事务)。

很遗憾,由于一个 talend 错误,我们无法批量提交以提高性能。由于产生的开销,我正在考虑更改会话以进行异步提交,但是在 java.sql.Connection 文档中我找不到任何有用的信息如何做到这一点。从 talend 到 postgresql,我们使用的是单个持久连接。

我的问题是:

  • 可以通过 java 连接/驱动程序(postgresql 9.3)配置异步提交吗?我们希望在会话的基础上进行配置,而不是针对整个数据库。
  • 我还有什么其他选择可以减少事务开销?就像我说的,现在每个插入都在每个自己的事务中。
  • 还有其他选择吗?

链接:

【问题讨论】:

  • 阻止您批量插入的 Talend 错误是什么?我在上面找不到打开的 JIRA。
  • Jira 票今天由 talend 支持打开,但我不知道是否公开 (jira.talendforge.org/browse/TDI-30083)。 Ticket 描述了使用带有 tpostgresqloutput 组件的 REST Web 服务时出现的问题。如果与其他 Web 服务结合使用,则组件上的“使用现有连接”和“使用批量大小”这两个选项都不起作用。对于第一个选项,我们找到了解决方法,但对于第二个,我们仍在寻找解决方案。
  • 我现在显然看不到票。我假设您是直接在组件中建立连接,而不是使用 tPostrgreSQLConnection 组件来避免第一个问题?不幸的是,这排除了您使用 tPostgreSQLCommit 组件的机会。我不确定错误是如何表现出来的,但一种选择可能是散列通常会发送到 Postgres 的数据,然后在另一个子作业中单独读回该散列,并在 tPostgreSQLOutput 组件之后使用 tPostgreSQLConnection 和 tPostgreSQLCommit。跨度>
  • 是在工作中使用RESTful Web服务组件还是在数据流中使用?如果性能是一个巨大的拖累,那么你有几个潜在的选择:如果你可以在同一个作业中同时使用 RESTful 和 Postgres 组件,但不是同一个子作业,那么可能会对来自 Web 服务的结果(后 JSON 处理)进行哈希处理,然后使用适当的 tPostgreSQLConnection 和 tPostgreSQLCommit 系列子作业将哈希读回子作业。
  • 如果您甚至无法做到这一点并且性能非常关键,那么您可以使用作业将数据放入临时平面文件或备用数据库,然后再使用另一个作业从那里提取数据到预期的 Postgres 目标。您还需要另一项工作来清理临时表/平面文件。这很可怕,但如果它真的只是一个 RESTful 和 Postgres 的组合问题,那将是一个更好的解决方法。

标签: java database postgresql heroku talend


【解决方案1】:

我没有将 PostgreSQL 与 Talend 一起使用,但通常插入是分批完成的,自动提交它们只是 Talend 的默认行为 - 我假设这是您在此处看到的会话选项。

您可以尝试将您的作业设置为使用 tPostgreSQLConnection,然后使用 tPostgreSQLCommit OnSubjobOk 完成它以一次性完成所有提交。无论如何,单个插入批次的性能可能很差,但应该会有所改善。

【讨论】:

  • 对此的一些补充:您可以使用与插入并行的 counter++ 执行 tJava,然后使用 If 链接,当您的计数器达到 100 左右时,您可以执行提交。计数器 += (计数器 >1000 ? -1000 : 1)
  • 这不是一个坏主意,但我可能会将计数器放入数据流中的 Numeric.Sequence 中,以使计数器更简单。通常,我也喜欢进行工作范围的提交(只在最后提交所有内容),除非我特别需要,因为如果您不必担心之前可能提交的内容,它会使错误恢复更加简单作业失败。
  • 通常我会同意你的观点,但请记住,这个网络服务将在 7/24 运行,所以即使我的想法也不是最好的。如果只有 90 个插入然后在那里几个小时不是您仍想提交的新插入。可能每 5-10-15 分钟一次暴力提交可以克服这个问题。
猜你喜欢
  • 2012-03-14
  • 1970-01-01
  • 1970-01-01
  • 2014-07-20
  • 1970-01-01
  • 1970-01-01
  • 2014-11-12
  • 1970-01-01
  • 2012-12-17
相关资源
最近更新 更多