【memcached】中的连接池初始化

在memcached中的连接池,是com.schooner.MemCached.SchoonerSockIOPool

 

在SchoonerSockIOPool中,

 

	// store instances of pools
	private static ConcurrentMap<String, SchoonerSockIOPool> pools = new ConcurrentHashMap<String, SchoonerSockIOPool>();
 

 

pools保存目前所有SchoonerSockIOPool,是个ConcurrentMap对象;key=poolName,value=Pool;

 

缺省的名字叫做default;

 

 

在设置好服务器后,需要调用初始化函数:

 

	/**
	 * Initializes the pool.
	 */
	public void initialize() {
		initDeadLock.lock();
		try {

			// if servers is not set, or it empty, then
			// throw a runtime exception
			if (servers == null || servers.length <= 0) {
				log.error("++++ trying to initialize with no servers");
				throw new IllegalStateException("++++ trying to initialize with no servers");
			}
			// pools
			socketPool = new HashMap<String, GenericObjectPool>(servers.length);
			hostDead = new ConcurrentHashMap<String, Date>();
			hostDeadDur = new ConcurrentHashMap<String, Long>();
			// only create up to maxCreate connections at once

			// initalize our internal hashing structures
			if (this.hashingAlg == CONSISTENT_HASH)
				populateConsistentBuckets();
			else
				populateBuckets();

			// mark pool as initialized
			this.initialized = true;

		} finally {
			initDeadLock.unlock();
		}

	}
 

 

主要是 populateConsistentBuckets或者 populateBuckets,
创建实际的Socket连接


不过这个函数有个问题,最后
			this.initialized = true;
但是在入口处没有判断initialized是否为true,这样可能会重复调用

 

 

-------------------------------------------------------------------------------------------

 

两者差别在于初始化的对象不同:

 

populateConsistentBuckets:初始化consistentBuckets(TreeMap<Long, String>)

populateBuckets : 初始化buckets(List<String>)

 

populateConsistentBuckets或者populateBuckets这2个函数在连接Server的处理上是一样的处理方式:


// Create a socket pool for each host
// Create an object pool to contain our active connections
GenericObjectPool gop;
SchoonerSockIOFactory factory;
if (authInfo != null) {
	factory = new AuthSchoonerSockIOFactory(servers[i], isTcp, bufferSize, socketTO, 
	                    socketConnectTO,nagle, authInfo);
} else {
	factory = new SchoonerSockIOFactory(servers[i], isTcp, bufferSize, socketTO, 
	                    socketConnectTO, nagle);
}
gop = new GenericObjectPool(factory, maxConn, GenericObjectPool.WHEN_EXHAUSTED_BLOCK, 
                      maxIdle, maxConn);
factory.setSockets(gop);
socketPool.put(servers[i], gop);
}
 

 

创建Socket的2个Factory类: AuthSchoonerSockIOFactory  SchoonerSockIOFactory

 

AuthSchoonerSockIOFactory 继承 SchoonerSockIOFactory 继承 BasePoolableObjectFactory

 

BasePoolableObjectFactory 是 Apache 的commonpool对象了

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(socket,memcached)