我正在尝试将Scala应用程序连接到Postgres集群,该集群由一个主节点和3个从/读取副本组成。我的application.conf今天看起来是这样的:

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}
      }
    }
  }
}

基于Postgres' documentation,我可以在一个JDBC URL中定义主服务器和从服务器,这将提供一些故障转移功能,例如:
jdbc:postgresql://host1:port1,host2:port2/database

但是,如果我想通过读写功能分离连接,我必须定义两个JDBC url,如下所示:
jdbc:postgresql://node1,node2,node3/database?targetServerType=master
jdbc:postgresql://node1,node2,node3/database?targetServerType=preferSlave&loadBalanceHosts=true

如何在Slick中定义两个JDBC url?我应该在slick.dbs下定义两个独立的实体,还是我的slick.dbs.default.db实体可以定义多个url?

最佳答案

Daniel Westheide's blog post中找到答案。总而言之,它可以通过一个DB包装类和自定义效果类型来完成,这些类型提供特定的规则来控制只读查询的定向位置,而不是写查询的定向位置。
然后你的光滑文件会是这样的:

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}
      }
    }
  }
}

由DB wrapper类将查询路由到“default”或“readonly”

关于postgresql - Postgres从站/只读副本的Scala Slick配置,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36201364/

10-13 09:06