我正试图将我的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的文档,我可以在一个JDBC URL中定义master和slave,这将为我提供一些故障切换功能,比如:
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的博客文章中找到了答案。总之,它可以使用DB包装类和自定义Effect类型来完成,这些类型提供了特定的规则来控制只读查询与写入查询的定向。
然后你的光滑文件会是这样的:
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包装类将查询路由到"默认"或"只读"