Apache默认提供的3种ObjectPool:
StackObjectPool,GenericObjectPool,SoftReferenceObejctPool
- public interface ObjectPool {
- Object borrowObject();
- void returnObject(Object borrowed);
- void addObject();
- void setFactory(PoolableObjectFactory)
- }
StackObjectPool,GenericObjectPool,SoftReferenceObejctPool,一般使用StackObejctPool就可以了
StackObjectPool-》 用java.util.Stack来维护对象池
SoftReferenceObjectPool-》 用java.util.ArrayList来维护对象池
GenericObjectPool-》 用org.apache.commons.collections.CursorableLinkedList来维护对象池
使用PoolableObjectFactory来创建pool。而没有必要间接使用ObjectPoolFactory createPool()
问题:
1.对应Socket,我需要真正实现的代码就是:
1) 如果socket正在被使用;那么是不能被其他人同时使用的
2) 如果socket使用完了;那不必关闭,可以设置状态并让其他人继续使用。
3) 如果将要使用的socket已经close(),那么必须重新open()
4) 对maxWait,maxIdle的处理;maxIdle表示可以在空闲时期建立的socket连接数;
2. dbcp的参考实现
PoolingDataSource 间接实现了ObjectPool接口(使用GenericObjectPool),
1)可以borrowObject,而borrowObject拿出来的Object就是Connection。
2)在初始化的时候,DataSourceImpl还可以根据pool的大小来addObject();
socket相对于数据库连接中的connection。
getConnection() --> borrowObject();
connection.close() -->returnObject(obj);
设计和实现:
1)需要实现ObjectPool接口,用于getSocketClient()
2)需要对SocketClient的封装,重载close()方法。
3)PoolableObjectFactory需要吗?
4)除了接口,commons-pool可以帮我做什么?
直接使用StackObjectPool,但是要自己实现PoolableObjectFactory 方法。
5) 如何判断有空闲的连接?