我正在构建使用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 。
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.
我无法更改存储过程。就是这样。
答案 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并处理其结果。