MySQL 异步驱动浅析 (二):缺点分析

本文由 Jilen 发表在 ScalaCool 团队博客。java

上一篇文章分析 Mysql 异步驱动的性能。本文阐述 Mysql Async 使用时须要注意的问题mysql

虽然 Mysql Async 性能出色,但使用过程当中仍是遇到了各类各样的问题git

1、不会自动关闭 PreparedStatement

假如你的业务中存在不少中 statement,这可能会致使 PreparedStatement 数量不够。
一般能够经过如下方法解决:github

  • 增长 mysql 服务端 PreparedStatement 数量设置
  • 另外还可使用修改过的版本(已发布到maven中心库)

2、执行事务时,全部语句必须串行

由于该驱动一个连接不能同时执行多个 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)
}复制代码

3、不支持客户端 PreparedStatement

Mysql-connector-java 支持客户端 PreparedStatement,从而能够开启将多个插入重写为一个批量插入的功能(rewriteBatchedStatements)。
批量插入语句能够减小锁的次数,从而大幅大幅提高性能的,这在一些插入频繁场景(如 akka-persistence)很是有用。async

要解决这个问题,只能手工生成 批量插入语句maven

4、Netty 是不可配置的

Netty 相关的设置硬编码在实现里,没法自定义 EventLoop 也没法开启 Linux 平台 native epoll 支持(该选项能够进一步提高性能,减小 GC 压力)。oop

使用前文提到的版本里已经默认开启了 native epoll 支持。post

相关文章
相关标签/搜索