将MySQL复制驱动程序与Slick/Play一起使用



我正在将Slick and Play与Play Slick插件一起使用,我很难确定是否可以将com.mysql.jdbc.ReplicationDriver与它们一起使用。我想使用该驱动程序的主/从功能。当只使用Slick时,它似乎就像将驱动程序作为参数传递给"forUrl"方法一样容易,但play-Slick会以不同的方式创建其连接。我已经找到了消息来源,试图弄清楚发生了什么,但我一无所获。有人知道这能不能做到吗?

PS:这就是我目前的配置:

db.default.url="jdbc:mysql:replication://master,slave/production?autoReconnectForPools=true&roundRobinLoadBalance=true&loadBalanceBlacklistTimeout=1000&readOnly=true"
db.default.driver=com.mysql.jdbc.ReplicationDriver
db.default.slickdriver=scala.slick.driver.MySQLDriver
db.default.user=root
db.default.password=""

当我查看Slick源代码时,它的驱动程序似乎只是定义了如何构建数据和查询,而没有包括任何关于实际连接的内容,所以我有点假设我可以告诉play-Slick将该驱动程序用于Slick,并将复制驱动程序用于JDBC

更新:因此,上面的配置似乎确实使用了正确的驱动程序,问题是我需要对这里解释的每个数据库操作应用Connection.readOnly(true)。我不确定Play是如何管理其连接的,有没有办法做到这一点?

Update2所以我在play框架的源代码中找到了它获得JDBC连接的位置,但我不知道如何向该过程添加任何内容。我是否必须将整个框架分叉才能实现这一点,或者有更明智的方法吗?

您可以扩展Slick的MySQLDriver,并覆盖包含的val DatabasecreateSession,以便在连接上始终调用readOnly。如果您不习惯Scala中的嵌套特征和潜在的初始化顺序问题,这可能会有点棘手。如有必要,请随时向Slick提交一份PR,以避免在您的用例中使用它们。

最新更新