发送写入到mysql主服务器并以光滑方式读取到从服务器

the*_*eon 6 mysql scala master-slave slick slick-2.0

用油滑和主/从设置使用MySQL,我如何确保写入(INSERT,UPDATE,等)发送到主机和读取(SELECT)被发送到奴隶?

the*_*eon 8

根据MySQL文档,我们需要设置Connection#setReadOnly(true|false).

在光滑中执行此操作的一种好方法是将以下函数添加到数据库代码中:

/**
 * Runs a block of read only database code. No transaction required.
 */
def readOnly[T](f: => T) = db withSession {
  Database.threadLocalSession.conn.setReadOnly(true)
  f
}

/**
 * Runs a block of read/write database code in a transaction. 
 * Any exceptions will rollback any writes.
 */
def readWrite[T](f: => T) = db withTransaction {
  Database.threadLocalSession.conn.setReadOnly(false)
  f
}
Run Code Online (Sandbox Code Playgroud)

然后你可以写这样的查询:

/**
 * Goes to slave
 */
def findUser(id: String) = readOnly {
  sql"SELECT ... FROM user WHERE id = $id".as[User].firstOption
}

/**
 * Goes to master
 */
def createUser(id: String) = readWrite {
  sqlu"INSERT INTO user VALUES(...)".execute
}
Run Code Online (Sandbox Code Playgroud)