如何让Akka Persistence Journal复用主数据库连接池?
Akka Persistence JDBC 复用主数据库连接池可行性解答
问题背景
现有Akka微服务,主数据库配置如下:
companyname.db { profile = "slick.jdbc.MySQLProfile$" db { driver = "org.mariadb.jdbc.Driver" url = "jdbc:mysql://127.0.0.1:1234" user = "root" password = "password" password = ${?DB_PASSWORD} connectionPool = "HikariCP" numThreads = 20 minConnections = 10 maxConnections = 20 connectionTestQuery = "SELECT 1" idleTimeout = 0 maxLifetime = 595000 keepAliveConnection = true } }
Akka Persistence Journal配置如下:
akka { persistence { journal { plugin = "jdbc-journal" } snapshot-store { plugin = "jdbc-snapshot-store" } } } jdbc-journal = { slick = ${abaro.opt.db} bufferSize = 5000 } jdbc-snapshot-store = { slick = ${abaro.opt.db} } jdbc-read-journal = { slick = ${abaro.opt.db} }
通过日志、VisualVM及查询information_schema.processlist发现系统创建了2个独立的连接池,希望让Akka Persistence Journal复用业务代码使用的主数据库连接池。
可行性及解决方案
完全可行,当前出现两个连接池的核心原因是JDBC持久化组件引用的配置节点abaro.opt.db和主业务配置companyname.db是两个独立配置,导致Slick初始化了两个不同的连接池实例。只需将JDBC插件的配置指向主数据库配置节点即可实现复用:
1. 修改Akka Persistence JDBC配置
将所有JDBC相关插件的slick配置替换为主数据库的配置节点:
akka { persistence { journal { plugin = "jdbc-journal" } snapshot-store { plugin = "jdbc-snapshot-store" } } } jdbc-journal = { slick = ${companyname.db} bufferSize = 5000 } jdbc-snapshot-store = { slick = ${companyname.db} } jdbc-read-journal = { slick = ${companyname.db} }
2. 验证复用效果
修改完成后重启服务,通过以下方式确认连接池已复用:
- 查看应用日志,确认仅初始化一个HikariCP连接池实例
- 查询
information_schema.processlist,数据库连接数符合主配置的maxConnections=20,无额外独立连接组 - 通过VisualVM监控,仅存在一个HikariCP相关的连接池线程组及连接实例
注意事项
- 主数据库连接池的
maxConnections参数需评估业务代码与Akka Persistence的总并发需求,避免因连接耗尽导致服务异常 - 确保Akka Persistence JDBC插件依赖的Slick版本与业务代码使用的Slick版本一致,避免版本兼容问题引发的配置解析或连接池初始化错误
- 主数据库配置变更后,所有依赖该配置的组件(业务代码、Journal、Snapshot等)会同步生效,无需单独调整
内容的提问来源于stack exchange,提问作者FrancMo
相关产品推荐
相关产品推荐

