2016-03-24 7 views
0

Ich versuche, meine Scala-Anwendung mit einem Postgres-Cluster zu verbinden, der aus einem Master-Knoten und drei Slaves/Read-Replikate besteht. Meine application.conf sieht wie folgt heute:Scala Slick-Konfiguration für Postgres-Slaves/Read Replicas

slick { 
    dbs { 
    default { 
     driver = "com.company.division.db.ExtendedPgDriver$" 
     db { 
     driver = "org.postgresql.Driver" 
     url = "jdbc:postgresql://"${?DB_ADDR}":"${?DB_PORT}"/"${?DB_NAME} 
     user = ${?DB_USERNAME} 
     password = ${?DB_PASSWORD} 
     } 
    } 
    } 
} 

Basierend auf Postgres' documentation, kann ich den Master und Slaves alle in einer JDBC-URL definieren, die mir einige Failover-Funktionen geben wird, wie folgt aus:

jdbc:postgresql://host1:port1,host2:port2/database 

Allerdings, wenn ich durch meine Lese Verbindungen trennen wollen und Schreibfähigkeiten, ich habe zwei JDBC-URLs zu definieren, wie folgt aus:

jdbc:postgresql://node1,node2,node3/database?targetServerType=master 
jdbc:postgresql://node1,node2,node3/database?targetServerType=preferSlave&loadBalanceHosts=true 

Wie kann ich zwei JDBC-URLs innerhalb Slick definieren ? Sollte ich zwei separate Entitäten unter slick.dbs definieren, oder kann meine slick.dbs.default.db Entität mehrere mehrere URLs definiert haben?

Antwort

0

Antwort gefunden von Daniel Westheide's blog post. Zusammenfassend kann dies mit einer DB-Wrapper-Klasse und benutzerdefinierten Effekttypen erfolgen, die spezifische Regeln zur Steuerung von schreibgeschützten Abfragen im Vergleich zu geschriebenen Abfragen enthalten.

dann Ihre Slick-Datei würde wie folgt aussehen:

slick { 
    dbs { 
    default { 
     driver = "com.yourdomain.db.ExtendedPgDriver$" 
     db { 
     driver = "org.postgresql.Driver" 
     url = "jdbc:postgresql://"${?DB_PORT_5432_TCP_ADDR}":"${?DB_PORT_5432_TCP_PORT}"/"${?DB_NAME} 
     user = ${?DB_USERNAME} 
     password = ${?DB_PASSWORD} 
     } 
    } 
    readonly { 
     driver = "com.yourdomain.db.ExtendedPgDriver$" 
     db { 
     driver = "org.postgresql.Driver" 
     url = ${DB_READ_REPLICA_URL} 
     user = ${?DB_USERNAME} 
     password = ${?DB_PASSWORD} 
     } 
    } 
    } 
} 

Und es ist bis zu Ihrer DB-Wrapper-Klasse zu routen Abfragen entweder ‚default‘ oder ‚Nur-Lese‘