Datenbankschema zur Laufzeit basierend auf dem angemeldeten Benutzer @ ände

Ich habe viele Fragen und Antworten zum dynamischen Routing von Datenquellen gelesen und eine Lösung mit @ implementierAbstractRoutingDataSource und eine andere (siehe unten). Das ist in Ordnung, erfordert jedoch fest codierte Eigenschaften für alle Datenquellen. Da die Anzahl der Benutzer, die die Anwendung verwenden, zunimmt, ist dies keine geeignete Methode zum Weiterleiten mehr. Außerdem müsste bei jeder Registrierung eines neuen Benutzers ein Eintrag zu den Eigenschaften hinzugefügt werden. Die Situation ist wie folgt

1 Datenbankserverviele Schemas auf diesem Server, jeder Benutzer hat sein eigenes Schema.Ich muss den Schemanamen nur zur Laufzeit änderner @Schemaname kann von dem angemeldeten Benutzer @ beibehalten werde

Ich benutzespring boot 1.4.0 zusammen mithibernate 5.1 undspring data jpa

Ich kann keine Möglichkeit finden, das Schema vollständig dynamisch zu ändern. Weiß jemand, wie es im Frühling geht?

BEARBEITEN

Danke an @Johannes Leimer, ich habe eine funktionierende Implementierung.

Hier ist der Code:

User Provider:

@Component
public class UserDetailsProvider {
    @Bean
    @Scope("prototype")
    public CustomUserDetails customUserDetails() {
        return (CustomUserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
    }
}

UserSchemaAwareRoutingDatasource:

public class UserSchemaAwareRoutingDataSource extends AbstractDataSource {
@Inject
Provider<CustomUserDetails> customUserDetails;

@Inject
Environment env;
private LoadingCache<String, DataSource> dataSources = createCache();

@Override
public Connection getConnection() throws SQLException {
    try {
        return determineTargetDataSource().getConnection();
    } catch (ExecutionException e){
        e.printStackTrace();

        return null;
    }
}

@Override
public Connection getConnection(String username, String password) throws SQLException {
    System.out.println("getConnection" + username);
    System.out.println("getConnection2" + password);
    try {
        return determineTargetDataSource().getConnection(username, password);
    } catch (ExecutionException e) {
        e.printStackTrace();
        return null;
    }
}

private DataSource determineTargetDataSource() throws SQLException, ExecutionException {
    try {
        String schema = customUserDetails.get().getUserDatabase();
        return dataSources.get(schema);
    } catch (NullPointerException e) {
        e.printStackTrace();

        return dataSources.get("fooooo");
    }

}

Antworten auf die Frage(4)

Ihre Antwort auf die Frage