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