2016-09-12 5 views
1

Ich möchte den Namen der aufgerufenen gespeicherten Prozedur dynamisch aus meiner Anwendung ändern, ohne meine Anwendung mithilfe von SimpleJDBC bereitstellen zu müssen.So ändern Sie dynamisch den Namen einer gespeicherten Prozedur bei Verwendung von Spring SimpleJdbcCall

Ich verwende kohärente Zwischenspeicherung zum Zwischenspeichern der aktiven Version der gespeicherten Prozedur, die in einer Steuertabelle verwaltet wird. Wenn es eine Funktionsänderung ohne Änderung der Eingabe/Ausgabe der gespeicherten Prozedur gibt, stelle ich eine neue Version der gespeicherten Prozedur bereit und aktualisiere den neuen Namen in der Steuertabelle. Nachdem die Gültigkeitsdauer (TTL) des Cache abgelaufen ist und der Cache aktualisiert wird, wird der neue Name der Anwendung zur Verfügung gestellt.

aber meine Beobachtung ist, obwohl der Cache die Anweisung ruft die ältere Version der gespeicherten Prozedur ausführen aktualisiert wird, die während der Bereitstellung verfügbar war, wie kann ich das mit diesem stark

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

Jede Hilfe ändern wird geschätzt .

Danke

Antwort

0

Sieht aus wie etwas falsch mit Ihrem Design.

Die SimpleJdbcCall ist one-time-Kompilierung Objekt:

/** 
* 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 { 

So kann man nicht seinen internen Zustand während der Laufzeit ändern.

Aber ich kann Ihnen die Lösung wie eine neue zwischengespeicherte Instanz für jeden neuen Prozedurnamen vorschlagen. Zu diesem Zweck können Sie einen @Cached Service codieren, der Ihnen eine SimpleJdbcCall Instanz zurückgibt. Wenn Sie den Cache ablaufen lassen, wird daher eine neue Instanz für Sie erstellt, und Sie müssen den tatsächlichen Prozedurnamen für das neue Objekt angeben.

P.S. Und ja, es gibt nichts für Spring Integration, bitte, sei vorsichtig, Tags für die Frage zu wählen.

Verwandte Themen