0

アプリケーションに非常に奇妙なバグがあります。ServiceMix でアプリケーションを実行すると、SimpleJdbcCall からの結果セットには、以前のストアド プロシージャ呼び出しからの以前の値が常にすべて含まれるという問題に直面しています。

ただし、ローカルで実行する場合は最後の値のみを保存します。

My Camel ルート (ダミー名あり):

        <from ref="cronQuartzEndpoint"/>
        <to uri="bean:userDAO?method=listAll"/>

        <split>
            <simple>${body}</simple>
            <to uri="bean:myStoredProcCaller?method=requestAndStoreUserName" />
            <to uri="bean:userDAO?method=saveUser" />
        </split>

ストアド プロシージャの呼び出し元のロジックを見てみましょう。ストアド プロシージャがユーザーの名前を返し、id をパラメーターとして待機するとします。

public User requestAndStoreUserName(User user) {
    LOG.info("userId: " + user.getId());

    //I know it's not necessary but I added it to ensure that new RowMapper is generated
    mySimpleJdbcCall.returningResultSet(USER_NAME_FIELD, new UserNameRowMapper());
    mySimpleJdbcCall.compile();

    Map<String, Object> results = mySimpleJdbcCall.execute(user.getId());

    List<String> userNames = (List<String>)results.get(USER_NAME_FIELD);
    LOG.info("userNames: " + userNames );
    if ( !userNames .isEmpty() ) {
        user.setName(userNames.get(0));
    }
    return user;
}

そして、私の RowMapper は次のように単純です:

private static class UserNameRowMapper implements RowMapper<String> {
    @Override
    public String mapRow(ResultSet rs, int rowNum) throws SQLException {
        return rs.getString(USER_NAME_RESPONSE_FIELD_INDEX);
    }
};

Camel ルートをローカルで実行した場合のログ:

  • ユーザー ID: 1
  • ユーザー名: [アリス]
  • ユーザー ID: 2
  • ユーザー名: [ボブ]

ServiceMix で実行した場合のログ:

  • ユーザー ID: 1
  • ユーザー名: [アリス]
  • ユーザー ID: 2
  • userNames: [アリス、ボブ]

アーティファクトの使用バージョンとすべての構成は、両側で同じです。この問題の背後にあるロジックは何ですか? ありがとう、ガーゲリー

4

1 に答える 1

0

問題は、私が使用した DataSource の背後にありました。最初に、プーリングを使用する commons.dbcp.BasicDataSource を使用しました。spring.jdbc.SimpleDriverDataSource に変更すると、動作し始めました。これは常に DB への新しい接続を要求しますが、前の接続プールはその接続プールを使用します。ただし、BasicDataSource は引き続き Maven で機能しましたが、SMX では機能しませんでした --> BasicDataSource のソースをまだ確認していませんでしたが、ローカルの Maven 依存関係と SMX で見つかった依存関係の唯一の違いは次のとおりです。このパッケージが SMX にインストールされている間、commons-pool をインポートしませんでした。ディレクトリに commons-pool がない場合に備えて、内部メカニズムがあると思います...

于 2013-06-19T13:14:09.803 に答える