2

Apache の (便利な) org.apache.commons.pool.impl.commmons.pool.GenericObjectPool.addObject() が例外をスローするように宣言されている正当な理由はありますか?

実際、org.apache.commons.pool.BaseObjectPool は、org.apache.commons.pool インターフェースから次のように宣言します。

/**
 * Create an object using the {@link PoolableObjectFactory factory} or other
 * implementation dependent mechanism, passivate it, and then place it in the idle object pool.
 * <code>addObject</code> is useful for "pre-loading" a pool with idle objects.
 * (Optional operation).
 *
 * @throws Exception when {@link PoolableObjectFactory#makeObject} fails.
 * @throws IllegalStateException after {@link #close} has been called on this pool.
 * @throws UnsupportedOperationException when this pool cannot add new idle objects.
 */
void addObject() throws Exception, IllegalStateException, UnsupportedOperationException;

なぜRuntimeExceptionの派生物ではないのでしょうか?

/**
 * Create an object, and place it into the pool.
 * addObject() is useful for "pre-loading" a pool with idle objects.
 */
@Override
public void addObject() throws Exception {
    assertOpen();
    if (_factory == null) {
        throw new IllegalStateException("Cannot add objects without a factory.");
    }
    T obj = _factory.makeObject();
    try {
        assertOpen();
        addObjectToPool(obj, false);
    } catch (IllegalStateException ex) { // Pool closed
        try {
            _factory.destroyObject(obj);
        } catch (Exception ex2) {
            // swallow
        }
        throw ex;
    }
}
4

1 に答える 1

0

直接的な答えは Javadoc にあります。

@throws Exception when {@link PoolableObjectFactory#makeObject} fails.

(余談: ファクトリ インターフェイスは、実際にはPooledObjectFactoryではなくのようですPoolable)

では、なぜ makeObject は Exception をスローするのでしょうか? オブジェクト プールの一般的な使用例は、データベース接続をプールすることです。データベース接続は、作成と破棄に費用がかかり、ソフトウェア ライセンス (N 接続ライセンス) によって制限される (だった?) 場合もあります。新しいデータベース接続を作成すると、SQLException がスローされるか、データベース サーバーがリモート マシン上にある場合は IOException がスローされる可能性があります。makeObject は Exception をスローするように宣言されているため、これらのチェックされた例外は、プールへの/からの接続の配置/取得を試行するときに通過してキャッチできます。

于 2014-06-19T18:36:54.603 に答える