For security and reliability reason our infrastructure partner (MuleSoft) is adding as less java modules to the runtime as possible.
While in java-module-context only those modules are accessible which are in the module-info.java of the module.
In the environment JDK17 with --add-modules=java.sql instantiating
DB2SimpleDataSource dbds = new com.ibm.db2.jcc.DB2SimpleDataSource();
fails with Exception in thread "main" java.lang.NoClassDefFoundError: jdk/net/ExtendedSocketOptions at jcc@12.1.2.0/com.ibm.db2.jcc.am.ao.D(ao.java:2102)
Suggested enhancement is to (additionally to the JDK8 compatiblity) fallback to other SocketOptions impelmentation when jdk.net.ExtendedSocketOptions is not on classpath (in your com.ibm.db2.jcc.am.ao class).
Reproduce:
Run with 11.5.*
java --add-modules=java.sql --module-path bin;lib\jcc-11.5.9.0.jar -m db2jdknetmodule/com.canda.test.Db2DatasourceTest
works as expected
Db2DatasourceTest
java.version = 17.0.9
jdk.module.path = bin;lib\jcc-11.5.9.0.jar
expected: jdk.net.ExtendedSocketOptions not found
dbds=com.ibm.db2.jcc.DB2SimpleDataSource@49993335
dbds.getJccVersion=IBM Data Server Driver for JDBC and SQLJ 4.33.31
dbxads=com.ibm.db2.jcc.DB2XADataSource@2038ae61
dbxads.getJccVersion=IBM Data Server Driver for JDBC and SQLJ 4.33.31
End Db2DatasourceTest
but running with 12.1.*
java --add-modules=java.sql --module-path bin;lib\jcc-12.1.2.0.jar -m db2jdknetmodule/com.canda.test.Db2DatasourceTest
fails with
Db2DatasourceTest
java.version = 17.0.9
jdk.module.path = bin;lib\jcc-12.1.2.0.jar
expected: jdk.net.ExtendedSocketOptions not found
Exception in thread "main" java.lang.NoClassDefFoundError: jdk/net/ExtendedSocketOptions
at jcc@12.1.2.0/com.ibm.db2.jcc.am.ao.D(ao.java:2102)
at jcc@12.1.2.0/com.ibm.db2.jcc.am.ao.<clinit>(ao.java:974)
at jcc@12.1.2.0/com.ibm.db2.jcc.DB2BaseDataSource.<init>(DB2BaseDataSource.java:3130)
at jcc@12.1.2.0/com.ibm.db2.jcc.DB2SimpleDataSource.<init>(DB2SimpleDataSource.java:177)
at db2jdknetmodule/com.canda.test.Db2DatasourceTest.main(Db2DatasourceTest.java:24)
Caused by: java.lang.ClassNotFoundException: jdk.net.ExtendedSocketOptions
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525)
... 5 more
see
db2jdknetmodule\src\module-info.java
db2jdknetmodule\src\com\canda\test\Db2DatasourceTest.java
in the attached zip.
Used Sources in the zip:
Java Source: /db2jdknetmodule/src/com/canda/test/Db2DatasourceTest.java
package com.canda.test;
import com.ibm.db2.jcc.DB2SimpleDataSource;
import com.ibm.db2.jcc.DB2XADataSource;
/**
*
*/
public class Db2DatasourceTest {
public static void main(String[] args) {
System.out.println("Db2DatasourceTest");
System.out.println("java.version = " + System.getProperty("java.version"));
System.out.println("jdk.module.path = " + System.getProperty("jdk.module.path"));
try {
Class<?> tempClass = Class.forName("jdk.net.ExtendedSocketOptions");
System.out.println(tempClass + " loaded via " + tempClass.getClassLoader());
} catch (ClassNotFoundException cnf) {
System.out.println("expected: jdk.net.ExtendedSocketOptions not found");
} catch (Throwable e) {
e.printStackTrace();
}
DB2SimpleDataSource dbds = new com.ibm.db2.jcc.DB2SimpleDataSource();
System.out.println("dbds=" + dbds);
System.out.println("dbds.getJccVersion=" + dbds.getJccVersion());
DB2XADataSource dbxads = new com.ibm.db2.jcc.DB2XADataSource();
System.out.println("dbxads=" + dbxads);
System.out.println("dbxads.getJccVersion=" + dbxads.getJccVersion());
System.out.println("End Db2DatasourceTest");
}
}
Module Source: /db2jdknetmodule/src/module-info.java
module db2jdknetmodule {
requires jcc;
exports com.canda.test;
}
with /db2jdknetmodule/lib/jcc-12.1.2.0.jar
Full stacktrace
Db2DatasourceTest
java.version = 17.0.9
jdk.module.path = bin;lib\jcc-12.1.2.0.jar
expected: jdk.net.ExtendedSocketOptions not found
Exception in thread "main" java.lang.NoClassDefFoundError: jdk/net/ExtendedSocketOptions
at jcc@12.1.2.0/com.ibm.db2.jcc.am.ao.D(ao.java:2102)
at jcc@12.1.2.0/com.ibm.db2.jcc.am.ao.<clinit>(ao.java:974)
at jcc@12.1.2.0/com.ibm.db2.jcc.DB2BaseDataSource.<init>(DB2BaseDataSource.java:3130)
at jcc@12.1.2.0/com.ibm.db2.jcc.DB2SimpleDataSource.<init>(DB2SimpleDataSource.java:177)
at db2jdknetmodule/com.canda.test.Db2DatasourceTest.main(Db2DatasourceTest.java:24)
Caused by: java.lang.ClassNotFoundException: jdk.net.ExtendedSocketOptions
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525)
... 5 more
In absence of jdk.net.ExtendedSocketOptions driver disable keepAlive Socket option. This may close the idle sockets.
Driver planning to stop the connection Exception, in case of jdk.net.ExtendedSocketOptions is not available. Driver will generate a Warning, without impacting the Application connection by throwing Exception. The Warning is to understand that keepAlive Socket option is disabled.
This new change will be available in future.