0

我的应用程序中有一个非常奇怪的错误。我面临的问题是,如果我在 ServiceMix 中运行我的应用程序,来自 SimpleJdbcCall 的结果集总是包含来自先前存储过程调用的所有先前值。

但是,在本地运行时仅存储最后一个值。

我的骆驼路线(使用假名):

        <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);
    }
};

如果我在本地运行我的骆驼路线的日志:

  • 用户ID:1
  • 用户名:[爱丽丝]
  • 用户ID:2
  • 用户名:[鲍勃]

如果在 ServiceMix 中运行它的日志:

  • 用户ID:1
  • 用户名:[爱丽丝]
  • 用户ID:2
  • 用户名:[爱丽丝,鲍勃]

双方使用的工件版本和所有配置都相同。任何想法这个问题背后的逻辑是什么?谢谢,格格利

4

1 回答 1

0

问题在于我使用的 DataSource:首先我使用了使用池的 commons.dbcp.BasicDataSource。当我将其更改为 spring.jdbc.SimpleDriverDataSource 时,它​​开始工作。这个总是请求到数据库的新连接,而前一个使用它的连接池。但是 BasicDataSource 仍然可以与 maven 一起使用,但在 SMX 中没有 --> 我还没有检查 BasicDataSource 的来源,但是我的本地 Maven 依赖项和在 SMX 中找到的依赖项之间的唯一区别是:在我的 Maven 中我没有'未导入 commons-pool,而此软件包已安装在 SMX 中。我假设有一个内部机制,以防目录中没有公共池......

于 2013-06-19T13:14:09.803 回答