mysql - 发送写入到 mysql master 并以 slick 方式读取到 slave

标签 mysql scala slick master-slave slick-2.0

使用 Slick 和 MySQL 设置的主/从,我如何确保写入(INSERTUPDATE 等)发送到 master 并读取(SELECT) 被发送到奴隶?

最佳答案

根据MySQL关于这个的文档,我们需要设置 Connection#setReadOnly(true|false)

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

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

然后你可以这样写查询:

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

关于mysql - 发送写入到 mysql master 并以 slick 方式读取到 slave,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19378293/

相关文章:

sql-server - 如何使用 Slick plain SQL 和 SQL Server 返回自动生成的 ID

php - 为所有用户的账户充值

mysql - Laravel 4 工匠迁移安装

scala - 如何检查Scala中的范围内是否存在整数?

scala - `synchronized` 使用方式不同

scala - 如何在 Scala Slick 查询中否定 "inSet"?

c# - 关闭 MySQL 连接在 .NET 应用程序中重要吗? (准确地说,C#)

mysql - 根据条件计算值的 SQL 查询

Scala查找范围内的缺失值

java - 如何将 java.sql.Timestamp 转换为 java.time.OffsetDateTime?