使用Spring SimpleJdbcCall

时间:2016-09-12 15:43:18

标签: spring spring-jdbc spring-cache

我想从我的应用程序动态更改被调用存储过程的名称,而不必使用SimpleJDBC部署我的应用程序。

我正在使用相干缓存来缓存在控制表中维护的存储过程的活动版本。在没有更改存储过程的输入/输出的情况下更改功能的情况下,我部署新版本的存储过程并更新控制表中的新名称。在缓存的TTL(生存时间)到期并刷新缓存后,新名称将可供应用程序使用。

然而,我的观察是即使刷新缓存,execute语句也会调用部署期间可用的旧版存储过程,如何更改

Map response = simpleJdbcCall.execute(new MapSqlParameterSource(map));

非常感谢任何帮助。

由于

1 个答案:

答案 0 :(得分:0)

您的设计看起来有问题。

SimpleJdbcCall是一次性编译对象:

/**
 * Compile this JdbcCall using provided parameters and meta data plus other settings.
 * <p>This finalizes the configuration for this object and subsequent attempts to compile are
 * ignored. This will be implicitly called the first time an un-compiled call is executed.
 * @throws org.springframework.dao.InvalidDataAccessApiUsageException if the object hasn't
 * been correctly initialized, for example if no DataSource has been provided
 */
public synchronized final void compile() throws InvalidDataAccessApiUsageException {

因此,您无法在运行时更改其内部状态。

但是我可以为每个新程序名称建议一个新的缓存实例。为此,您可以编写一些@Cached服务代码,该服务将返回SimpleJdbcCall个实例。因此,如果您使缓存过期,将为您创建一个新实例,您有责任将实际过程名称填充到该新对象。

P.S。是的,Spring Integration没有任何内容,请小心选择问题的标签。