我正在测试从 BoneCP 到 HikariCP 的迁移。
基准测试(HikariCP Benchmark)的结果如下:
Benchmark (maxPoolSize) (pool) Mode Samples Score Score error Units czhbConnectionBench.cycleCnnection 32 hikari thrpt 16 1033,071 38,893 ops/ms czhbConnectionBench.cycleCnnection 32 骨 thrpt 16 1648,954 42,610 ops/ms czhbConnectionBench.cycleCnnection 32 tomcat thrpt 16 592,838 21,709 ops/ms czhbConnectionBench.cycleCnnection 32 c3p0 thrpt 16 125,857 3,666 ops/ms czhbConnectionBench.cycleCnnection 32 vibur thrpt 16 831,693 9,299 ops/ms czhbStatementBench.cycleStatement 32 hikari thrpt 16 49983,959 4796,385 ops/ms czhbStatementBench.cycleStatement 32 骨 thrpt 8 7022,146 526,111 ops/ms czhbStatementBench.cycleStatement 32 tomcat thrpt 16 28777,731 1011,316 ops/ms czhbStatementBench.cycleStatement 32 c3p0 thrpt 16 3367,641 137,937 操作/毫秒 czhbStatementBench.cycleStatement 32 vibur thrpt 16 1739,060 45,451 ops/ms
我想分数越高越好,所以:
- 为什么 HikariCP 中的 cycleConnection 比 BoneCP 低?
- 考虑到 cycleConnection 结果,cycleStatement 结果是否足以更好地迁移到 HikariCP?
- 分数错误列是什么意思?
这些主题中的任何提示、建议等或相关迁移到 HikariCP 对我都非常有帮助。
非常感谢
第一次更新:
@brettw,感谢您的建议,并祝贺您的出色工作。
昨晚我用nohup ./benchmark.sh &进行了完整的运行,得到了以下结果:
Benchmark (maxPoolSize) (pool) Mode Samples Score Score error Units czhbConnectionBench.cycleCnnection 32 hikari thrpt 150 965,017 27,307 ops/ms czhbConnectionBench.cycleCnnection 32 骨 thrpt 150 1528,097 26,963 ops/ms czhbConnectionBench.cycleCnnection 32 tomcat thrpt 150 473,702 8,068 ops/ms czhbConnectionBench.cycleCnnection 32 c3p0 thrpt 150 108,527 1,591 操作/毫秒 czhbConnectionBench.cycleCnnection 32 vibur thrpt 150 740,603 14,556 ops/ms czhbStatementBench.cycleStatement 32 hikari thrpt 60 47998,292 3112,217 ops/ms czhbStatementBench.cycleStatement 32 骨骼 thrpt 120 6210,647 110,100 ops/ms czhbStatementBench.cycleStatement 32 tomcat thrpt 150 25919,389 437,232 ops/ms czhbStatementBench.cycleStatement 32 c3p0 thrpt 150 3074,133 62,629 ops/ms czhbStatementBench.cycleStatement 32 vibur thrpt 150 1517,554 25,027 ops/ms
查看扩展输出,我在日志中看到此异常堆栈跟踪 6 次:
迭代 15:[com.zaxxer.hikari.benchmark.StatementBench.cycleStatement-jmh-worker-7] 信息 com.zaxxer.hikari.pool.HikariPool - HikariCP 池 HikariPool-0 正在关闭 下。 java.lang.IllegalStateException:尝试从包中移除一个没有借用或保留的对象 在 com.zaxxer.hikari.util.ConcurrentBag.remove(ConcurrentBag.java:207) 在 com.zaxxer.hikari.pool.HikariPool.closeConnection(HikariPool.java:394) 在 com.zaxxer.hikari.pool.HikariPool.releaseConnection(HikariPool.java:223) 在 com.zaxxer.hikari.proxy.ConnectionProxy.close(ConnectionProxy.java:216) 在 com.zaxxer.hikari.benchmark.StatementBench$ConnectionState.teardown(StatementBench.java:63) 在 com.zaxxer.hikari.benchmark.generated.StatementBench_cycleStatement.cycleStatement_Throughput(StatementBench_cycleStatement.java:100) 在 sun.reflect.GeneratedMethodAccessor1.invoke(未知来源) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:606) 在 org.openjdk.jmh.runner.LoopBenchmarkHandler$BenchmarkTask.call(LoopBenchmarkHandler.java:204) 在 org.openjdk.jmh.runner.LoopBenchmarkHandler$BenchmarkTask.call(LoopBenchmarkHandler.java:186) 在 java.util.concurrent.FutureTask.run(FutureTask.java:262) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 在 java.lang.Thread.run(Thread.java:745)
最后,我从您的帖子中回答您的其他主题:
- pom.xml 已更新以实现快速和完整的执行。
- 干净启动后无法执行测试。
- 有一个带有 Web 应用程序的 Tomcat 服务器。在测试执行期间,计算机既没有高负载也没有运行繁重的进程。
- JDK版本为jdk1.7.0_67
- Linux 是 x86_64-redhat-linux-gnu
- CPU 型号为 Intel(R) Xeon(R) CPU E5-2690 0 @ 2.90GHz
- 也许是一个重要的问题:测试已经在使用 VMWare 部署的虚拟机中运行。
再次感谢
第二次更新:关于迁移的问题已经变成另一个关于虚拟化和基准测试的问题,这也很有趣和有用。
到目前为止,我必须专注于虚拟环境。当我有一点时间时,我会在真实而直接的环境中运行测试,并将结果带到这里。我敢打赌,这些测试会将 HikariCP 显示为最佳连接池。
@brettw,感谢您的支持和良好的态度。