0

Ich suche nach einer Möglichkeit, eine Transaktionsmanagerinstanz zur Laufzeit dynamisch aufzunehmen.Spring Txn - mehrere Datenquellen, transactionManaggers, Wie entscheidet man sich mit @Transcational über einen Transaktionsmanager in Runtime?

Ich habe einen Dienst, der dynamisch eine DAO Referenz zur Laufzeit ist die Auswahl auf der Grundlage eines Parameters wie unten

@Mapper //Spring-MyBatis mapper 
public interface DataMapper { 
    void save(Object domain); 
} 

public class DAO { 
    private DataMapper mapper; 

    public void save(Object domain) { 
    mapper.save(domain); 
    } 
} 

@Component 
public class Service { 

    private DAO onlineBusinessDAO; 
    private DAO storeBusinessDAO; 

    public void save(String businessIdentifier, Object domain) { 
     identifyDAOBasedOn(businessIdentifier).save(domain); 
    } 

    private DAO identifyDAOBasedOn(String businessIdentifier) { 
    Switch(businessIdentifier) { 
     case "Online": 
      return onlineBusinessDAO; 
     case "Store": 
      return storeBusinessDAO; 
    } 
    } 
} 

Bei der Implementierung oben anhand von businessIdentifier i, auf denen am entscheiden Instanz von DAO zu pickup und innen DAO Ich benutze mybatis Mapper, um den Job zu machen.

So habe ich mehrere Datenquellen (eine für Online, eine für Geschäft) und mehrere transactionManagers unter einer bestimmten DAO-Instanz.

Ich möchte spring @Transactional auf save() unter Service-Klasse nutzen, aber ich muss angeben, welche "transactionManager" Referenz für @Transactional dynamisch während der Laufzeit auf der BusinessIdentifier-Parameter verwendet werden soll.

Gibt es einen Weg, dies zu erreichen?

Ich möchte meinen Code sauberer halten, weniger so viel wie möglich - möchte nicht 2 Implementierungen von Service oder DAO mit Fassade erstellen.

Antwort

0

finden Sie wie folgt vor:

1.Erstellen 2 different helper DAO implementation classes die transactional managers ihre eigenen verwenden.

2.Just stellen Sie sicher, dass both Implementation classes sollte implement ein common interface

3. Main DAO Klasse sowohl die Helfer Implementierungen halten (Verwendung von @Qualifier machen diese zwei Helfer-Implementierungen zu unterscheiden)

4.Main DAO erhalten einen datasource Namen als parameter und darauf basierende Methode der richtigen helper bean

+0

Dank für die Antwort nennen, wollen wir nicht eine spezifische Implementierungsklasse als implementatio einführen n sieht genau gleich aus, das Problem liegt hier an unterschiedlichen Schemas, in denen Daten gespeichert sind. Die gesamte Anwendungslogik bleibt gleich. Daher suchen wir nach einer Möglichkeit, den Transaktionsmanager basierend auf dem Parameter, der für die Methode empfangen wird, dynamisch anzugeben. – sriharishk

Verwandte Themen