public class SqlConnection {
private Integer connectionId;
public SqlConnection() {
Random random = new Random(System.currentTimeMillis());
this.connectionId = random.nextInt();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
模拟SqlConnection创建时间需要很久的情况
public abstract class ObjectPool<T> {
private final Set<T> canUse = new HashSet<>();
private final Set<T> inUse = new HashSet<>();
protected abstract T create();
public synchronized T getOut() {
if (canUse.isEmpty()) {
canUse.add(create());
}
var instance = canUse.iterator().next();
canUse.remove(instance);
inUse.add(instance);
return instance;
}
public synchronized void putIn(T instance) {
inUse.remove(instance);
canUse.add(instance);
}
@Override
public synchronized String toString() {
return String.format("可用=%d 使用中=%d", canUse.size(), inUse.size());
}
}
public class SqlConnectionPool extends ObjectPool<SqlConnection>{
@Override
protected SqlConnection create() {
return new SqlConnection();
}
}
public static void main(String[] args) {
SqlConnectionPool sqlConnectionPool = new SqlConnectionPool();
System.out.println(sqlConnectionPool.toString());
var connection1 = sqlConnectionPool.getOut();
System.out.println(sqlConnectionPool.toString());
var connection2 = sqlConnectionPool.getOut();
var connection3 = sqlConnectionPool.getOut();
System.out.println(sqlConnectionPool.toString());
sqlConnectionPool.putIn(connection1);
sqlConnectionPool.putIn(connection2);
System.out.println(sqlConnectionPool.toString());
var connection4 = sqlConnectionPool.getOut();
var connection5 = sqlConnectionPool.getOut();
System.out.println(sqlConnectionPool.toString());
}