【发布时间】:2013-09-27 05:09:41
【问题描述】:
我刚刚用 Akka 写了一个 JDBC 连接池。
它使用一个actor来保存真实数据库连接的“maxPoolSize”集合。调用者向池参与者请求连接并收到Future[Connection],并且连接的状态变为“忙碌”,直到调用者将其返回到池中connection.close。如果所有连接都忙,则新传入的连接请求将被放置在等待队列中(也由池参与者持有)。稍后当连接返回时,等待请求将被满足。
这个逻辑在akka中的实现非常简单,就几十行代码。然而,当使用 BoneCP Multithread Test 来测试性能时(即调用者 close 在满足 getConnection 返回的 Future[Connection] 时立即连接。基准 traversed 所有 close 请求和 Await对于结果Future),我发现 Akka 版本比许多其他连接池实现慢,例如 tomcat-jdbc、BoneCP 甚至 commons DBCP。
我尝试过的调整:
- 将池actor分成多个,每个都包含所有真实连接的一部分
- 调整一些默认调度程序配置参数(吞吐量、并行度)
但没有明显改善。
我的问题是:
- 这是一个合适的用例,使用 akka 可以获得更好的性能吗?
- 如果是,我怎样才能获得与那些手工线程连接池实现类似或更好的基准数据?
- 如果不是,为什么?是否有任何既定标准可以帮助我决定何时使用 akka?
【问题讨论】:
-
我并不感到非常惊讶。不要怀疑你的开发技能,但是这些其他库有更多的开发时间来解决这个非常具体的问题
-
希望看到#3 点的答案!
-
我认为#3在这里很好地涵盖了:stackoverflow.com/questions/4493001/good-use-case-for-akka
-
当所有连接都消失时,基准的表现如何?驱动程序锁定了吗?
-
我会在您的代码中搜索一些阻塞行为。如果只是几十行,也许你可以在这里粘贴?
标签: performance scala akka