1

我正在构建使用 Apache Camel 的概念证明。我正在尝试构建一个路由,该路由将使用 JDBC 组件调用 Sybase DB 上的存储过程,然后处理其多个结果集。

到目前为止,我使用 Spring 进行了以下配置:

<camelContext id="context">
    <route>
        <from uri="direct:start"/>
        <bean ref="sqlStatementCreator"/>
        <to uri="jdbc:dataSource?resetAutoCommit=false"/>
        <bean ref="sqlResultsProcessor"/>
    </route>
</camelContext>

sqlStatementCreator是一个简单的类,只有一个方法返回包含执行存储过程的 sql 语句的字符串:

{call sp_name ('some arg')}

存储过程返回 2 个(或更多)结果集以及我需要的数据。

问题是如何访问sqlResultsProcessor中的那些结果集?

JDBC 组件的文档声明“结果在 OUT 主体中作为 ArrayList> 返回”。如果存储过程只返回一个结果集,那将非常有效。但是,当我在sqlResultsProcessor中检查 Exchange 的主体时,如果有多个结果集,我有null

  • 也许骆驼不能在带有 JDBC 组件的 OUT 正文中返回多个结果集?
  • 也许最好编写一个自定义 bean 来访问将处理结果并将它们放入 OUT 主体的数据库?
  • 或者,也许我完全错过了什么?

Apache Camel 版本是 2.9.2。

我必须在 jdbc 组件中添加resetAutoCommit=false选项,否则 Sybase 会抛出异常:

com.sybase.jdbc3.jdbc.SybSQLException: Stored procedure 'sp_name' may be run only in unchained transaction mode.

而且我无法更改存储过程。它就是这样。

4

1 回答 1

4

正如我自己发现的那样,Apache Camel (v.2.9.0) 目前不支持使用JDBCProducer处理多个结果集。正如您在处理Sql *方法中的JDBCProducer的源代码中看到的:

if (stmt.execute(sql)) {
    rs = stmt.getResultSet();
    setResultSet(exchange, rs);
}

执行 SQL 语句后,生产者获取第一个 ResultSet 并将其设置为 Exchange。

因此,如果您需要处理多个 ResultSet,最好编写自己的 bean 来执行 SQL 并处理其结果。

于 2012-07-02T10:40:32.137 回答