⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 objectpool.java

📁 Sequoia ERP是一个真正的企业级开源ERP解决方案。它提供的模块包括:电子商务应用(e-commerce), POS系统(point of sales),知识管理,存货与仓库管理
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
     * it will be released from the pool.  If timestamps are enabled, the client     * may update the last used time.  Otherwise, the last used time is only     * updated when an object is acquired or released.  The default value is     * 30 minutes.     * @see #setIdleTimeoutEnabled     * @param millis The idle time, in milliseconds.     * @throws java.lang.IllegalStateException     *    Occurs when you try to set the idle timeout after the pool     *    has been initialized.     */    public void setIdleTimeout(long millis) {        if (initialized)            throw new IllegalStateException(INITIALIZED);        idleTimeoutMillis = millis;        if (log.isDebugEnabled())            log.debug("setIdleTimeout(" + millis + ")");    }    /**     * Gets the minimum idle time to release an unused object from the pool.     * @see #setIdleTimeout     */    public long getIdleTimeout() {        return idleTimeoutMillis;    }    /**     * Sets the minimum idle time to make an object eligible for garbage     * collection.  If the object is in use and has not been used for this     * amount of time, it may be returned to the pool.  If timestamps are     * enabled, the client may update the last used time (this is generally     * recommended if garbage collection is enabled).  Otherwise, the last used     * time is only updated when an object is acquired or released.  The default     * value is 20 minutes.     * @see #setGCEnabled     * @param millis The idle time, in milliseconds.     * @throws java.lang.IllegalStateException     *    Occurs when you try to set the garbage collection idle time after the     *    pool has been initialized.     */    public void setGCMinIdleTime(long millis) {        if (initialized)            throw new IllegalStateException(INITIALIZED);        gcMinIdleMillis = millis;        if (log.isDebugEnabled())            log.debug("setGCMinIdleTime(" + millis + ")");    }    /**     * Gets the minimum idle time to make an object eligible for garbage     * collection.     * @see #setGCMinIdleTime     */    public long getGCMinIdleTime() {        return gcMinIdleMillis;    }    /**     * Sets the length of time between garbage collection and idle timeout runs.     * This is inexact - if there are many pools with garbage collection and/or     * the idle timeout enabled, there will not be a thread for each one, and     * several nearby actions may be combined.  Likewise if the collection     * process is lengthy for certain types of pooled objects (not recommended),     * other actions may be delayed.  This is to prevend an unnecessary     * proliferation of threads.  Note that this parameter controls     * both garbage collection and the idle timeout - and they will be performed     * together if both are enabled.  The deafult value is 2 minutes.     * @throws java.lang.IllegalStateException     *    Occurs when you try to set the garbage collection interval after the     *    pool has been initialized.     */    public void setGCInterval(long millis) {        if (initialized)            throw new IllegalStateException(INITIALIZED);        gcIntervalMillis = millis;        if (log.isDebugEnabled())            log.debug("setGCInterval(" + gcIntervalMillis + ")");    }    /**     * Gets the length of time between garbage collection and idle timeout runs.     * @see #setGCInterval     */    public long getGCInterval() {        return gcIntervalMillis;    }    /**     * Sets whether a request for an object will block if the pool size is     * maxed out and no objects are available.  If set to block, the request     * will not return until an object is available.  Otherwise, the request     * will return null immediately (and may be retried).  If multiple     * requests block, there is no guarantee which will return first.  The     * default is to block.     * @throws java.lang.IllegalStateException     *    Occurs when you try to set the blocking parameter after the     *    pool has been initialized.     */    public void setBlocking(boolean blocking) {        if (initialized)            throw new IllegalStateException(INITIALIZED);        this.blocking = blocking;    }    /**     * Gets whether a request for an object will block if the pool size is     * maxed out and no objects are available.     * @see #setBlocking     */    public boolean isBlocking() {        return blocking;    }    /** sets how long to wait for a free object when blocking, -1 indicating     *  forever.     */    public void setBlockingTimeout(int blockingTimeout) {        this.blockingTimeout = blockingTimeout;    }    /** get how long this pool will wait for a free object while blocking */    public int getBlockingTimeout() {        return this.blockingTimeout;    }    /**     * Sets whether object clients can update the last used time.  If not, the     * last used time will only be updated when the object is given to a client     * and returned to the pool.  This time is important if the idle timeout or     * garbage collection is enabled (particularly the latter).  The default     * is false.     * @throws java.lang.IllegalStateException     *    Occurs when you try to set the timestamp parameter after the     *    pool has been initialized.     */    public void setTimestampUsed(boolean timestamp) {        if (initialized)            throw new IllegalStateException(INITIALIZED);        trackLastUsed = timestamp;        if (log.isDebugEnabled())            log.debug("setTimestampUsed(" + timestamp + ")");    }    /**     * Gets whether object clients can update the last used time.     */    public boolean isTimestampUsed() {        return trackLastUsed;    }    /**     * Sets the response for object errors.  If this flag is set and an error     * event occurs, the object is removed from the pool entirely.  Otherwise,     * the object is returned to the pool of available objects.  For example, a     * SQL error may not indicate a bad database connection (flag not set),     * while a TCP/IP error probably indicates a bad network connection (flag     * set).  If this flag is not set, you can still manually invalidate     * objects using markObjectAsInvalid.     * @see #markObjectAsInvalid     * @see #objectError     */    public void setInvalidateOnError(boolean invalidate) {        if (initialized)            throw new IllegalStateException(INITIALIZED);        invalidateOnError = invalidate;    }    /**     * Gets whether objects are removed from the pool in case of errors.     */    public boolean isInvalidateOnError() {        return invalidateOnError;    }    /**     * Prepares the pool for use.  This must be called exactly once before     * getObject is even called.  The pool name and object factory must be set     * before this call will succeed.     * @throws java.lang.IllegalStateException     *    Occurs when you try to initialize the pool without setting the object     *    factory or name, or you initialize the pool more than once.     */    public void initialize() {        if (factory == null || poolName == null)            throw new IllegalStateException("Factory and Name must be set before pool initialization!");        if (initialized)            throw new IllegalStateException("Cannot initialize more than once!");        initialized = true;        permits = new FIFOSemaphore(maxSize);        factory.poolStarted(this);        lastGC = System.currentTimeMillis();        //fill pool to min size        fillToMin();        /*        int max = maxSize <= 0 ? minSize : Math.min(minSize, maxSize);        Collection cs = new LinkedList();        for(int i=0; i<max; i++)        {           cs.add(getObject(null));        }        while (Iterator i = cs.iterator(); i.hasNext();)        {           releaseObject(i.next());        } // end of while ()        */        collector.addPool(this);    }    /**     * Shuts down the pool.  All outstanding objects are closed and all objects     * are released from the pool.  No getObject or releaseObject calls will     * succeed after this method is called - and they will probably fail during     * this method call.     */    public void shutDown() {        collector.removePool(this);        factory.poolClosing(this);        // close all objects        synchronized (objects) {            for (Iterator it = objects.values().iterator(); it.hasNext();) {                ObjectRecord rec = (ObjectRecord) it.next();                if (null != rec) {                    if (rec.isInUse())                        factory.returnObject(rec.getClientObject());                    factory.deleteObject(rec.getObject());                    rec.close();                }            }            objects.clear();            deadObjects.clear();        }//end of synch        factory = null;        poolName = null;        initialized = false;    }    /**     * Gets an object from the pool.  If all the objects in the pool are in use,     * creates a new object, adds it to the pool, and returns it.  If all     * objects are in use and the pool is at maximum size, will block or     * return null.     * @see #setBlocking     */    public Object getObject() {        return getObject(null);    }    /**     * Gets an object that fits the specified parameters from the pool.     * If all the objects in the pool are in use or don't fit, creates     * a new object, adds it to the pool, and returns it.  If all     * objects are in use or don't fit and the pool is at maximum size,     * will block or return null.     * @see #setBlocking     */    public Object getObject(Object parameters) {        if (objects == null)            throw new IllegalStateException("Tried to use pool before it was Initialized or after it was ShutDown!");        Object result = factory.isUniqueRequest();        if (result != null) // If this is identical to a previous request,            return result;  // return the same result.  This is the 2.4 total hack to                            // share local connections within a managed tx.        try {            if (permits.attempt(blockingTimeout)) {                ObjectRecord rec = null;                synchronized (objects) {                    for (Iterator it = objects.values().iterator(); it.hasNext();) {                        rec = (ObjectRecord) it.next();                        if (null != rec && !rec.isInUse() && factory.checkValidObject(rec.getObject(), parameters)) {                            log.info("Handing out from pool object: " + rec.getObject());                            try {                                rec.setInUse(true);                            } catch (ConcurrentModificationException e) {                                log.info("Conflict trying to set rec. in use flag:" + rec.getObject());                                // That's OK, just go on and try another object                                continue;//shouldn't happen now.                            }                            break;                        }                        rec = null;//not found                    }                }//synch on objects                if (rec == null) {                    try {                        rec = createNewObject(parameters);                    } catch (Exception e) {                        log.error("Exception in creating new object for pool", e);                        permits.release();                        throw e;                    }                } // end of if ()                if (rec == null) {                    permits.release();                    String message = "Pool is broken, did not find or create an object";                    log.error(message);                    throw new RuntimeException(message);                } // end of if ()                Object ob = rec.getObject();                result = factory.prepareObject(ob);                if (result != ob) rec.setClientObject(result);                if (result instanceof PooledObject)                    ((PooledObject) result).addPoolEventListener(this);                log.debug("Pool " + this + " gave out object: " + result);                return result;            }//end of permits            else {                //we timed out                throw new RuntimeException("No ManagedConnections Available!");            } // end of else        }//try        catch (RuntimeException e) {            throw e;        } // end of catch        catch (InterruptedException ie) {            log.info("Interrupted while requesting permit!", new Exception("stacktrace"));            throw new RuntimeException("Interrupted while requesting permit!");        } // end of try-catch        catch (Exception e) {            log.info("problem getting connection from pool", e);            throw new RuntimeException("problem getting connection from pool " + e.getMessage());        } // end of catch

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -