Hibernate的延迟加载技术使用到了OpenSessionInViewFilter,每个客户端请求过来都会开一个session,这样在高并发的情况下是否会因为数据库连接拖慢处理速度呢?实地用mybatis延迟加载和hibernate延迟加载做了一下测试:
SpringMVC+Mybatis+mybatis 启用cache
ab -c 100 -n 1000 http://localhost:8080/springmvc/test/test
This is ApacheBench, Version 2.3 <$Revision: 655654 $>Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking localhost (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests
Server Software: Apache-Coyote/1.1
Server Hostname: localhost
Server Port: 8080
Document Path: /resdn/test/test
Document Length: 915 bytes
Concurrency Level: 100
Time taken for tests: 3.562 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Total transferred: 1183000 bytes
HTML transferred: 915000 bytes
Requests per second: 280.73 [#/sec] (mean)
Time per request: 356.220 [ms] (mean)
Time per request: 3.562 [ms] (mean, across all concurrent requests)
Transfer rate: 324.31 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.7 0 15
Processing: 3 344 749.9 74 3545
Waiting: 3 318 734.4 63 3545
Total: 4 345 749.9 75 3545
Percentage of the requests served within a certain time (ms)
50% 75
66% 120
75% 194
80% 308
90% 1588
95% 2365
98% 3407
99% 3488
100% 3545 (longest request)
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
如果使用hibernate +struts2+ehcache+OpenSessionInViewFilter这样的方案,无论如何每秒并发也上不去30个.
ab -c 100 -n 1000 http://localhost:8080/ssh/page
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking localhost (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests
Server Software: Apache-Coyote/1.1
Server Hostname: localhost
Server Port: 8080
Document Path: /ssh/page
Document Length: 520585 bytes
Concurrency Level: 100
Time taken for tests: 36.948 seconds
Complete requests: 1000
Failed requests: 947
(Connect: 0, Receive: 0, Length: 947, Exceptions: 0)
Write errors: 0
Total transferred: 520806359 bytes
HTML transferred: 520586359 bytes
Requests per second: 27.06 [#/sec] (mean)
Time per request: 3694.811 [ms] (mean)
Time per request: 36.948 [ms] (mean, across all concurrent requests)
Transfer rate: 13765.25 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 1.8 0 54
Processing: 53 3552 4694.9 1564 31344
Waiting: 25 3462 4682.0 1461 31323
Total: 54 3552 4695.0 1564 31344
Percentage of the requests served within a certain time (ms)
50% 1564
66% 3649
75% 5358
80% 6429
90% 10016
95% 13438
98% 18506
99% 21403
100% 31344 (longest request)
----------------------------------------------------------------------------------------------------------------
hibernate真的这么差劲么?会不会是struts2和springmvc的不同导致的性能差异? 更换为springmvc+hibernate+opensessioninviewfilter+ehcache进行测试
ab -c 100 -n 1000 http://localhost:8080/sh/test/test
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking localhost (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests
Server Software: Apache-Coyote/1.1
Server Hostname: localhost
Server Port: 8080
Document Path: /sh/test/test
Document Length: 275 bytes
Concurrency Level: 100
Time taken for tests: 0.995 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Total transferred: 540000 bytes
HTML transferred: 275000 bytes
Requests per second: 1004.97 [#/sec] (mean)
Time per request: 99.506 [ms] (mean)
Time per request: 0.995 [ms] (mean, across all concurrent requests)
Transfer rate: 529.96 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 1.1 0 26
Processing: 10 94 80.8 69 605
Waiting: 10 89 81.0 63 603
Total: 11 94 80.8 69 605
Percentage of the requests served within a certain time (ms)
50% 69
66% 85
75% 100
80% 104
90% 166
95% 264
98% 420
99% 443
100% 605 (longest request)
每秒处理1000并发请求有没有?
真的是struts2就这么差劲么?去除struts2的零配置插件后进行测试,速度一下子提升到了每秒处理300并发,弄了半天结论就是Hibernate不慢,是Struts2的零配置插件convention拖慢了性能,对比Struts2和SpringMVC,还是SpringMVC的处理速度一流,比struts2快很多。