Postgres JDBC 2nd Connection Class not found

Got an odd possible bug.

v8.1 to v8.3 conversion testing. Client has a PostgreSQL cluster with two distinct databases. Both URLs point at the same IP and port--just the DB name is different:

  • jdbc:postgresql://a.b.c.d:5432/db1?ssl=true&sslmode=require&sslfactory=org.postgresql.ssl.NonValidatingFactory
  • jdbc:postgresql://a.b.c.d:5432/db2?ssl=true&sslmode=require&sslfactory=org.postgresql.ssl.NonValidatingFactory

(Names changed. Notable possible difference: "db2" includes some uppercase characters.)

First connection works reliably.

Second connection gives me this:

java.sql.SQLException: Cannot load JDBC driver class 'org.postgresql.Driver'
	at org.apache.commons.dbcp2.DriverFactory.createDriver(DriverFactory.java:53)
	at org.apache.commons.dbcp2.BasicDataSource.createConnectionFactory(BasicDataSource.java:474)
	at org.apache.commons.dbcp2.BasicDataSource.createDataSource(BasicDataSource.java:541)
	at org.apache.commons.dbcp2.BasicDataSource.getLogWriter(BasicDataSource.java:1088)
	at org.apache.commons.dbcp2.BasicDataSourceFactory.createDataSource(BasicDataSourceFactory.java:330)
	at com.inductiveautomation.ignition.gateway.datasource.DatasourceManagerImpl.createDataSource(DatasourceManagerImpl.java:259)
	at com.inductiveautomation.ignition.gateway.IgnitionGateway.createDataSource(IgnitionGateway.java:2914)
	at com.inductiveautomation.ignition.gateway.datasource.DatasourceImpl.initializeDatasource(DatasourceImpl.java:285)
	at com.inductiveautomation.ignition.gateway.datasource.DatasourceImpl.runTest(DatasourceImpl.java:312)
	at com.inductiveautomation.ignition.gateway.datasource.DatasourceManagerImpl$FaultedDatasourceRetryer.lambda$newRetryRunnable$0(DatasourceManagerImpl.java:1318)
	at com.inductiveautomation.ignition.common.execution.impl.BasicExecutionEngine$TrackedTask.run(BasicExecutionEngine.java:599)
	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
	at java.base/java.util.concurrent.FutureTask.runAndReset(Unknown Source)
	at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Unknown Source)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.base/java.lang.Thread.run(Unknown Source)
Caused by: java.lang.ClassNotFoundException: org.postgresql.Driver
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(Unknown Source)
	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(Unknown Source)
	at java.base/java.lang.ClassLoader.loadClass(Unknown Source)
	at org.eclipse.jetty.ee10.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:443)
	at java.base/java.lang.ClassLoader.loadClass(Unknown Source)
	at org.apache.commons.dbcp2.DriverFactory.createDriver(DriverFactory.java:48)
	at org.apache.commons.dbcp2.BasicDataSource.createConnectionFactory(BasicDataSource.java:474)
	at org.apache.commons.dbcp2.BasicDataSource.createDataSource(BasicDataSource.java:541)
	at org.apache.commons.dbcp2.BasicDataSource.getLogWriter(BasicDataSource.java:1088)
	at org.apache.commons.dbcp2.BasicDataSourceFactory.createDataSource(BasicDataSourceFactory.java:330)
	at com.inductiveautomation.ignition.gateway.datasource.DatasourceManagerImpl.createDataSource(DatasourceManagerImpl.java:259)
	at com.inductiveautomation.ignition.gateway.IgnitionGateway.createDataSource(IgnitionGateway.java:2914)
	at com.inductiveautomation.ignition.gateway.datasource.DatasourceImpl.initializeDatasource(DatasourceImpl.java:285)
	at com.inductiveautomation.ignition.gateway.datasource.DatasourceImpl.runTest(DatasourceImpl.java:312)
	at com.inductiveautomation.ignition.gateway.datasource.DatasourceManagerImpl$FaultedDatasourceRetryer.lambda$newRetryRunnable$0(DatasourceManagerImpl.java:1318)
	at com.inductiveautomation.ignition.common.execution.impl.BasicExecutionEngine$TrackedTask.run(BasicExecutionEngine.java:599)
	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
	at java.base/java.util.concurrent.FutureTask.runAndReset(Unknown Source)
	at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Unknown Source)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.base/java.lang.Thread.run(Unknown Source)

???

Had to delete the driver that came through the upgrade process and then recreate the connections with the "Postgresql" instead of the "Postgresql JDBC Driver".

I'm curious why the legacy imported driver would work with one connection but not the other. :man_shrugging:

Did one have a different initial pool size?

Yes. The latter was set to initial size==4.

I can confirm that setting the initial size back to 4 broke that connection again.

I created an issue to track this.

It looks like it doesn't have anything to do with upgrades or Postgres - I think any Initial Size value is just broken.