【问题标题】:How to implement master/slave structure with squeryl and play framework如何用squeryl和play框架实现主从结构
【发布时间】:2014-11-18 01:10:22
【问题描述】:

我正在运行一个使用 squeryl 和 mysql 数据库的游戏框架网站。 我需要使用 squeryl 来运行对从属设备的所有读取查询和对主设备的所有写入查询。

我怎样才能做到这一点?通过 squeryl 或通过 jdbc 连接器本身。

非常感谢,

【问题讨论】:

    标签: scala playframework master-slave squeryl


    【解决方案1】:

    我自己不倾向于使用 MySQL,但这里有一个想法:

    根据文档here,如果在 Connnection 上正确设置了 readOnly 属性,MySQL JDBC 驱动程序将在从属设备之间循环。为了检索和更改当前连接,您需要使用类似

    的代码
    transaction {
      val conn = Session.currentSession.connection
      conn.setReadOnly(true)
      //Your code here
    }
    

    更好的是,您可以创建自己的 readOnlyTransaction 方法:

    def readOnlyTransaction(f: => Unit) = {
      transaction {
        val conn = Session.currentSession.connection
        val orig = conn.getReadOnly()
        conn.setReadOnly(true)
        f
        conn.setReadOnly(orig)
      }
    }
    

    然后像这样使用它:

    readOnlyTransaction {
      //Your code here
    }
    

    您可能需要稍微清理一下,以便在发生异常时重置默认只读状态,但您大致了解。

    【讨论】:

    • 感谢戴夫的帮助。实际上,这种方法的唯一问题是读/写操作之间的分离是在开发人员端完成的,以将读操作与写操作分开。我想知道我们是否可以通过拦截查询本身并决定它是否是读/写操作的方式自动化它?这个想法是为了防止任何可能发生的人为错误,因为从站不应该接收任何写操作。并且master应该只处理写操作并与slave同步。
    • 在这种情况下,我认为您真的想在 JDBC 级别执行此操作。我不知道你的建议是否是一个好方法。它会破坏事务语义,因为事务必须发生在单个连接上。我希望将连接设置为只读会导致驱动程序在开发人员尝试发出更改任何内容的语句时出错,因此最好让这些错误发生并在测试期间处理错误。另外,请记住“选择更新”存在,因此您不能依赖选择永远不会改变任何内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-25
    • 2016-09-16
    • 2013-02-28
    • 1970-01-01
    相关资源
    最近更新 更多