public class MyURLConnection {
private boolean close;
private boolean connected;
private String name;
private String key;
public MyURLConnection(String name) {
this.name = name;
}
public MyURLConnection(String name,String key) {
this.name = name;
this.key = key;
}
public boolean isClose() {
return close;
}
public void setClose(boolean close) {
this.close = close;
}
public boolean isConnected() {
return connected;
}
public void setConnected(boolean connected) {
this.connected = connected;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void send(){
System.out.println(this.toString());
}
public String getKey() {
return key;
}
@Override
public String toString() {
return "MyURLConnection{" +
"close=" + close +
", connected=" + connected +
", name='" + name + '\'' +
", key='" + key + '\'' +
'}';
}
}
public class MyURLConnectionKeyedPoolableObjectFactory implements KeyedPoolableObjectFactory<String,MyURLConnection> {
AtomicInteger ato = new AtomicInteger(0);
@Override
public MyURLConnection makeObject(String key) throws Exception {
MyURLConnection connection = new MyURLConnection("connection"+ato.incrementAndGet(),key);
connection.setConnected(true);
System.out.println("key="+key+","+connection.getName()+",makeObject");
return connection;
}
@Override
public void destroyObject(String key, MyURLConnection connection) throws Exception {
connection.setClose(true);
System.out.println("key="+key+","+connection.getName()+",destroyObject");
}
@Override
public boolean validateObject(String key, MyURLConnection connection) {
System.out.println("key="+key+","+connection.getName()+",validateObject");
return !connection.isClose();
}
@Override
public void activateObject(String key, MyURLConnection connection) throws Exception {
System.out.println("key="+key+","+connection.getName()+",activateObject");
}
@Override
public void passivateObject(String key, MyURLConnection connection) throws Exception {
System.out.println("key="+key+","+connection.getName()+",passivateObject");
}
}
public class KeyedPoolableObjectTest {
public static void main(String[] args) throws Exception {
MyURLConnectionKeyedPoolableObjectFactory factory = new MyURLConnectionKeyedPoolableObjectFactory();
KeyedObjectPool pool = new StackKeyedObjectPool(factory);
try {
String[] keys = {"mysql","oracle","sqlserver"};
System.out.println("======================First ==========================");
for (int i = 0; i < 10; i++) {
String key = keys[i%keys.length];
MyURLConnection connection = (MyURLConnection)pool.borrowObject(key);
boolean exception = false;
try {
if(i==4){
throw new Exception(key+"远程已关闭连接");
}
connection.send();
} catch(Exception ex) {
ex.printStackTrace();
pool.invalidateObject(key, connection);
exception = true;
} finally {
if(!exception){
pool.returnObject(key, connection);
}
}
}
} finally {
try {
pool.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
源码:
_pools是1个hashmap