【问题标题】:Accessing stored procedure's multiple result sets in Apache Camel在 Apache Camel 中访问存储过程的多个结果集
【发布时间】:2012-06-25 10:45:57
【问题描述】:

我正在构建使用 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 语句的 String:

{call sp_name ('some arg')}

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

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

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

  • 也许 Camel 无法在带有 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.

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

【问题讨论】:

    标签: java stored-procedures jdbc apache-camel


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-10-06
      • 1970-01-01
      • 1970-01-01
      • 2019-04-26
      • 2016-08-06
      • 2011-04-22
      • 1970-01-01
      • 2014-11-10
      相关资源
      最近更新 更多