【发布时间】: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