本文由 Jilen 发表在 ScalaCool 团队博客。java
上一篇文章分析 Mysql 异步驱动的性能。本文阐述 Mysql Async 使用时须要注意的问题mysql
虽然 Mysql Async 性能出色,但使用过程当中仍是遇到了各类各样的问题git
假如你的业务中存在不少中 statement,这可能会致使 PreparedStatement
数量不够。
一般能够经过如下方法解决:github
PreparedStatement
数量设置由于该驱动一个连接不能同时执行多个 SQL 语句(受限于MySQL协议)因此sql
conn.inTransaction { c =>
val fa = c.sendQuery("xxx")
val fb = c.sendQuery("yyy")
}复制代码
这样的代码就不能正确运行,必须改为以下串行或等价的形式异步
conn.inTransaction { c =>
for {
a <- c.sendQuery("xxx")
b <- c.sendQuery("yyy")
} yield (a, b)
}复制代码
Mysql-connector-java
支持客户端 PreparedStatement,从而能够开启将多个插入重写为一个批量插入的功能(rewriteBatchedStatements)。
批量插入语句能够减小锁的次数,从而大幅大幅提高性能的,这在一些插入频繁场景(如 akka-persistence)很是有用。async
要解决这个问题,只能手工生成 批量插入语句
。maven
Netty 相关的设置硬编码在实现里,没法自定义 EventLoop
也没法开启 Linux 平台 native epoll
支持(该选项能够进一步提高性能,减小 GC 压力)。oop
使用前文提到的版本里已经默认开启了 native epoll
支持。post