我想升级GWT-JDO应用程序以使用DBCP2而不是DBCP。配置部分运行良好,但是我在控制台中看到警告

WARN [org.apache.commons.dbcp2.PoolingDataSource] PoolableConnectionFactory not linked to pool. Calling setPool() to fix the configuration.


PersistenceManagerFactory是使用JDOHelper构建的,因此我无法访问DBCP2对象来设置池。我们正在使用

JDOHelper.getPersistenceManagerFactory(properties)


我在JDO类中进行了一些调试,发现即使发出警告,该池实际上仍设置为连接工厂。
请从org.apache.commons.dbcp2.PoolingDataSource中找到以下代码

// Verify that _pool's factory refers back to it.  If not, log a warning and try to fix.
        if (pcf.getPool() != _pool) {
            log.warn(Utils.getMessage("poolingDataSource.factoryConfig"));
            @SuppressWarnings("unchecked") // PCF must have a pool of PCs
            ObjectPool<PoolableConnection> p = (ObjectPool<PoolableConnection>) _pool;
            pcf.setPool(p);
        }


有人知道使用JDOHelper正确处理JDO-Datanucleus-DBCP2配置的方法吗?

最佳答案

DBCP2似乎应该执行某些奇怪的操作,但并非出于某些原因。在DataNucleus DBCP2 connector code中,他们有

connectionPool = new org.apache.commons.pool2.impl.GenericObjectPool(poolableCF);


我个人希望这足以使DBCP2知道DBCP2库返回的库链接到poolableCF(即传入的内容),但是如果您这样做,它会给出此日志消息。如果添加以下行

poolableCF.setPool(connectionPool);


在他们的代码之后,您不会立即收到该日志消息。也许您想将其贡献给DataNucleus项目?

10-08 20:18