上一篇文章分析 Mysql 异步驱动的性能。本文阐述 Mysql Async 使用时需要注意的问题
虽然 Mysql Async 性能出色,但使用过程中还是遇到了各种各样的问题
一、不会自动关闭 PreparedStatement
假如你的业务中存在很多中 statement,这可能会导致 PreparedStatement
数量不够。
通常可以通过以下方法解决:
增加 mysql 服务端 PreparedStatement
数量设置
另外还可以使用修改过的 版本
(已发布到maven中心库)
二、执行事务时,所有语句必须串行
因为该驱动一个链接不能同时执行多个 SQL 语句(受限于MySQL协议)所以
conn.inTransaction { c =>
val fa = c.sendQuery("xxx")
val fb = c.sendQuery("yyy")
}
这样的代码就不能正确运行,必须改成如下串行或等价的形式
conn.inTransaction { c =>
for {
a
b
} yield (a, b)
}
三、不支持客户端 PreparedStatement
Mysql-connector-java
支持客户端 PreparedStatement,从而可以开启将多个插入重写为一个批量插入的功能(rewriteBatchedStatements)。
批量插入语句可以减少锁的次数,从而大幅大幅提升性能的,这在一些插入频繁场景(如 akka-persistence)非常有用。
要解决这个问题,只能手工生成 批量插入语句
。
四、Netty 是不可配置的
Netty 相关的设置硬编码在实现里,无法自定义 EventLoop
也无法开启 Linux 平台 native epoll
支持(该选项可以进一步提升性能,减少 GC 压力)。
使用前文提到的版本里已经默认开启了 native epoll
支持。
注意:本文来自Scala Cool。本站无法对本文内容的真实性、完整性、及时性、原创性提供任何保证,请您自行验证核实并承担相关的风险与后果!
CoLaBug.com遵循[CC BY-SA 4.0]分享并保持客观立场,本站不承担此类作品侵权行为的直接责任及连带责任。您有版权、意见、投诉等问题,请通过[eMail]联系我们处理,如需商业授权请联系原作者/原网站。