在 select-sql-parameter-source 中重复调用

Duplicate call in select-sql-parameter-source

我正在使用动态查询,使用 select-sql-parameter-source 来搜索我需要的信息。

这是我的配置:

<int-jdbc:inbound-channel-adapter query="SELECT * FROM CUSTOMER WHERE CUSTOMER.LASTUPDATE_ACTIVE &lt; TO_DATE(:last_process_date,'YYYY-MM-DD HH24:Mi:SS') "     
    channel="headerEnricher.customerBR01"
    update="" 
    row-mapper="customerRowMapper"
    data-source="jdbcTemplate"
    max-rows-per-poll="0"
    select-sql-parameter-source="parameterSource.customerBR01">
    <!-- Cron Time -->
    <int:poller fixed-rate="50" time-unit="SECONDS">
    </int:poller>
</int-jdbc:inbound-channel-adapter>

<!-- This is to get last process date -->
<bean id="parameterSource.customerBR01" factory-bean="parameterSourceFactory.customerBR01" factory-method="createParameterSourceNoCache">
    <constructor-arg value="" />
</bean>

<bean id="parameterSourceFactory.customerBR01" class="org.springframework.integration.jdbc.ExpressionEvaluatingSqlParameterSourceFactory">
    <property name="parameterExpressions">
        <map>
            <!-- Here we get the last process date -->
            <entry key="last_process_date" value="@hsqlHistoricProcessServiceDateDAO.getLastProcessDate(3,1,'CUSTOMER')" />
        </map>
    </property>
</bean>

我正在寻找 loggin 出现了两次,所以我更改了此函数中的代码:

hsqlHistoricProcessServiceDateDAO.getLastProcessDate

到return只有一个账户变量。 函数代码 hsqlHistoricProcessServiceDateDAO.getLastProcessDate 如下:

private int contador = 0;

public String getLastProcessDate(Integer country, Integer business, String tableName) {
    contador++;

    System.out.println("Contador "+ contador);

    return Integer.toString(contador);
}

结果是:

Contador 1
Contador 2

因此,此方法被调用了两次,而我只需要调用一次,因为在 "real code" 中我为此进行了两次记录。

对于您的用例,您不需要禁用缓存;用这个代替...

<bean id="parameterSource.customerBR01" 
    factory-bean="parameterSourceFactory.customerBR01"
    factory-method="createParameterSource">
        <constructor-arg value="" />
</bean>

当在多个参数中使用相同的密钥并且您希望重新评估每个参数时,需要 ...NoCache 版本。

禁用缓存会产生额外的副作用,因为每次使用密钥都会调用两次 getValue() 方法。一通电话来自 NamedParameterUtils.substituteNamedParameters();第二个来自 NamedParameterUtils.buildValueArray().