我在 Linux 上有一个 Oracle 19c 系统,并使用 Windows AD KDC 启用了 krb5 身份验证。 sqlplus 和 jdbc 访问都工作正常。当我尝试使用 ucp(ucp11.jar、ojdbc11.jar)进行测试时,仅当我设置 initialPoolSize > 2 时,才会遇到 ORA-12631。
PoolDataSource pds = PoolDataSourceFactory.getPoolDataSource();
pds.setConnectionFactoryClassName("oracle.jdbc.pool.OracleDataSource");
pds.set(url);
pds.setUser(null); // for krb5 auth
pds.setPassword(null); // for krb5 auth
pds.setInitializePoolSize(3); // failed with ORA-12631
pds.setMinPoolSize(3);
pds.setMaxPoolSize(20);
pds.setTimeoutCheckInterval(120);
pds.setInactiveConnectionTimeout(300);
pds.setConnectionProperties(krbProperties); // krb5 properties like KRB5_CC_NAME
当我调用 pds.getConnection() 时,抛出 ORA-12631,且initialPoolSize > 2。为什么它不适用于更大的initialPoolSize?使用 krb5 auth,没有用户/密码。为什么抛出ORA-12631?
如果我将initialPoolSize 设置为1 或2,我就可以获取连接并查询数据库。如果我关闭 krb5 auth,它也有效。
将初始大小设置为 3 时,用于创建 3 个连接的 UCP 后台线程可能会遇到竞争条件,其中第一个线程正在启动 TGT/TGS,而另一个线程在 TGS 不可用时被告知 TGS 可用。还没有。
您可以在启动池之前使用 Kerberos 创建和关闭独立的 JDBC 连接来验证这一点。此初始连接将创建 TGT/TGS,后台线程将在 UCP 启动时使用该 TGT/TGS。