在Apache Camel中访问存储过程的多个结果集

时间:2012-06-25 10:45:57

标签: java stored-procedures jdbc apache-camel

我正在构建使用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表示“结果作为ArrayList&gt;在OUT主体中返回”。如果存储过程只返回一个结果集,则该方法非常有效。但是,如果我在 sqlResultsProcessor 中检查Exchange的正文时有多个结果集,则我有 null

  • 也许Camel无法使用JDBC组件在OUT主体中返回多个结果集?
  • 也许最好编写一个自定义bean来访问将要访问的数据库 处理结果并将它们放入OUT体内?
  • 或许我完全错过了什么?

Apache Camel版本是2.9.2。

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

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

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

1 个答案:

答案 0 :(得分:3)

正如我自己发现的那样, 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并处理其结果。