选择线程数目时谨慎考虑线程切换开销

本文探讨了在使用HikariCP连接池时,配置合适的线程数以提高性能的重要性。通过实测发现,线程数过多会导致线程切换开销增大,反而降低性能。文中引用了HikariCP的建议公式`connections = ((core_count * 2) + effective_spindle_count)`来确定连接池大小,并提供了测试结果来支持论点。
摘要由CSDN通过智能技术生成

最近为了使用更加高效的connection jdbc pool,在网上发现有个叫hikariCP的貌似不错,里面有篇文章讲了关于配置pool size的魔法,不是越多越好,而是应该恰到好处。

https://github.com/brettwooldridge/HikariCP/wiki/About-Pool-Sizing

考虑整体系统性能,考虑线程执行需要的等待时间,设计合理的线程数目。(Connection Pool Size)

我自己也做了一组测试。

测试描述:

对一个spring4+spring security3+hibernate4 (ehcache+hikariCP)+mysql的系统的某个业务方法(save user,insert new user) 性能测试,统计多线程多执行时候save方法的执行时间。


性能收集代码,在spring里面加入aop,统计方法执行时间

package com.elulian.CustomerSecurityManagementSystem.service;

import java.util.Enumeration;
import java.util.concurrent.ConcurrentHashMap;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; 

public class PerfInterceptor implements MethodInterceptor {

	private static final Logger logger = LoggerFactory.getLogger(PerfInterceptor.class);

	private static ConcurrentHashMap<String, MethodStats> methodStats = new ConcurrentHashMap<String, MethodStats>();
	
	public static Enumeration<MethodStats> getMethodStats(){
		return methodStats.elements();
	}
	
	public static void clearMethodStats(){
		methodStats.clear();
	}
	
	public static void printMethodStats(){
		
		Enumeration<MethodStats> e = methodStats.elements();
		
		
		while(e.hasMoreElements()){
			logger.info(e.nextElement().toString());
		}
	}
	
	/* 
	 * performance monitor for service layer
	 * @see org.aopalliance.intercept.MethodInterceptor#invoke(org.aopalliance.intercept.MethodInvocation)
	 */

	public Object invoke(MethodInvocation method) throws Throwable {
		long start = System.nanoTime();
		try {
			return method.proceed();
		} finally {
			updateStats(method.getMethod().getName(),
					(System.nanoTime() - start));
		}
	}

	private void updateStats(String methodName, long elapsedTime) {
		MethodStats stats = methodStats.get(methodName);
		if (stats == null) {
			stats = new MethodStats(methodName);
			methodStats.put(methodName, stats);
		}
		stats.count++;
		stats.totalTime += elapsedTime;
		if (elapsedTime > stats.maxTime) {
			stats.maxTime = elapsedTime;
		}
		
		if(elapsedTime < stats.minTime || 0 == stats.minTime){
			stats.minTime = elapsedTime;
		}

	}
	
	class MethodStats {
		public String methodName;
		public long count;
		public long totalTime;
		public long maxTime;
		public long minTime;

		public MethodStats(String methodName) {
			this.methodName = methodName;
		}

		@Override
		public String toString() {
			StringBuilder sb = new StringBuilder("method: ");
			sb.append(met
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值