package com.meidusa.amoeba.jdbc; import java.sql.Connection; import java.sql.SQLException; import org.apache.log4j.Logger; import com.meidusa.amoeba.net.poolable.ObjectPool; import com.meidusa.amoeba.net.poolable.PoolableObject; /** * * @author struct * */ public class PoolableJdbcConnection extends ConnectionWrapper implements PoolableObject { private static Logger logger = Logger.getLogger(PoolableJdbcConnection.class); private ObjectPool objectPool; private boolean active; private ResultSetHandler resultSetHandler; public ResultSetHandler getResultSetHandler() { return resultSetHandler; } public void setResultSetHandler(ResultSetHandler ioHandler) { this.resultSetHandler = ioHandler; } public PoolableJdbcConnection(Connection conn){ super(conn); } public ObjectPool getObjectPool() { return objectPool; } public synchronized void setObjectPool(ObjectPool pool) { this.objectPool = pool; } public boolean isActive() { return active; } public void setActive(boolean active) { this.active = active; } public boolean isRemovedFromPool() { return objectPool == null; } public void close(){ try { if(isClosed()) return; } catch (SQLException e1) { logger.error("when invoke isclosed error",e1); } try { super.close(); } catch (SQLException e) { logger.error("when invoke close error",e); } final ObjectPool tmpPool = objectPool; objectPool = null; try { if(tmpPool != null){ /** * 处于active 状态的 poolableObject,可以用ObjectPool.invalidateObject 方式从pool中销毁 * 否则只能等待被borrow 或者 idle time out */ if(isActive()){ tmpPool.invalidateObject(this); } } } catch (Exception e) { // TODO handle exception logger.error("close pool error", e); } } }