1

ApacheCamelを使用するための概念実証を構築しています。JDBCコンポーネントを使用してSybaseDBのストアドプロシージャを呼び出し、その複数の結果セットを処理するルートを構築しようとしています。

これまでのところ、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を返すメソッドが1つしかない単純なクラスです。

{call sp_name ('some arg')}

ストアドプロシージャは、必要なデータを含む2つ(またはそれ以上)の結果セットを返します。

問題は、 sqlResultsProcessorでこれらの結果セットにアクセスする方法です。

JDBCコンポーネントのドキュメントには、「結果はArrayListとしてOUT本体に返される>」と記載されています。ストアドプロシージャが1つの結果セットのみを返す場合、これは完全に機能します。ただし、複数の結果セットの場合、sqlResultsProcessorでExchangeの本体を確認すると、 nullが発生します。

  • たぶん、CamelはJDBCコンポーネントを使用してOUT本体に複数の結果セットを返すことができませんか?
  • 結果を処理してOUT本体に入れるDBにアクセスするためのカスタムBeanを作成する方が良いのではないでしょうか。
  • それとも私は完全に何かが欠けていますか?

ApacheCamelのバージョンは2.9.2です。

例外がSybaseによってスローされたため、 resetAutoCommit=falseオプションをjdbcコンポーネントに追加する必要がありました。

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を使用した複数の結果セットの処理をサポートしていません。あなたがprocessingSql *メソッドのJDBCProducerのソースコードで見ることができるように:

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

SQLステートメントを実行した後、プロデューサーは最初のResultSetを取得し、それをExchangeに設定します。

したがって、複数のResultSetを処理する必要がある場合は、SQLを実行してその結果を処理する独自のBeanを作成することをお勧めします。

于 2012-07-02T10:40:32.137 に答える