在 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 < 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()
.
我正在使用动态查询,使用 select-sql-parameter-source 来搜索我需要的信息。
这是我的配置:
<int-jdbc:inbound-channel-adapter query="SELECT * FROM CUSTOMER WHERE CUSTOMER.LASTUPDATE_ACTIVE < 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()
.