【发布时间】:2023-03-27 11:36:01
【问题描述】:
使用 Slick 和 MySQL 设置的 Master/Slave,我如何确保将写入(INSERT、UPDATE 等)发送到主服务器,并将读取(SELECT)发送到从服务器?
【问题讨论】:
标签: mysql scala slick master-slave slick-2.0
使用 Slick 和 MySQL 设置的 Master/Slave,我如何确保将写入(INSERT、UPDATE 等)发送到主服务器,并将读取(SELECT)发送到从服务器?
【问题讨论】:
标签: mysql scala slick master-slave slick-2.0
根据MySQL docs on this,我们需要设置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
}
【讨论】: