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

相關文章
相關標籤/搜索