0

I need to extract data from a Sybase source and then use this data to extract values from an SQL Server source.

I am using these drivers:

    // Database drivers
    // https://mvnrepository.com/artifact/jdbc.sybase/jconn4
    implementation("jdbc.sybase:jconn4:16.0")
    // https://mvnrepository.com/artifact/com.microsoft.sqlserver/mssql-jdbc
    implementation("com.microsoft.sqlserver:mssql-jdbc:13.2.0.jre11")

My program will run in debug, but fails to run normally. This is the Sybase call

package gov.usdohud.chums;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.LinkedHashSet;

import org.apache.logging.log4j.core.Logger;

import com.sybase.jdbc4.jdbc.SybDataSource;

import gov.usdohud.dao.CaseData;
import gov.usdohud.model.ConfigData;

public class GetCases {
    Logger LOGGER;
    ConfigData config;
    
    public GetCases(Logger LOGGER, ConfigData config) {
        this.config = config;
        this.LOGGER = LOGGER;
    }
    
    /**
     * Get case data from the warehouse
     * @return
     */
    public LinkedHashSet<CaseData> getCaseData() {
        LinkedHashSet<CaseData> cases = new LinkedHashSet<>();
        // Query SFDW for cases
        String sqlString = "select top 20 b.case_nbr, b.loan_nbr, b.score_dt, b.undrwrtr_id from idb_1 a, total_scorecard_data_final b "
                + "where a.case_nbr = b.case_nbr and endrsmnt_cy = ?";

        SybDataSource datasource = new SybDataSource();
        datasource.setServerName(config.getSfdwServer().getName());
        datasource.setPortNumber(Integer.valueOf(config.getSfdwServer().getPort()));
        datasource.setDatabaseName(config.getSfdwServer().getDatabase());
        datasource.setUser(config.getSfdwServer().getUserId());
        datasource.setPassword(config.getSfdwServer().getAuthentication());
        try (Connection conn = datasource.getConnection();) {
            PreparedStatement stmt = conn.prepareStatement(sqlString);
            stmt.setLong(1, config.getFiscalYear());
            ResultSet rs = stmt.executeQuery();

            while (rs.next()) {
                CaseData thisRow = new CaseData();
                thisRow.setCase_nbr(rs.getString("case_nbr"));
                thisRow.setLoan_nbr(rs.getString("loan_nbr"));
                thisRow.setScore_dt(rs.getString("score_dt"));
                thisRow.setUndrwrtr_id(rs.getString("undrwrtr_id"));
                cases.add(thisRow);
            }
            LOGGER.info("Preparring to process {} scoring records.", cases.size());
        } catch (SQLException e) {
            LOGGER.error("SQL Exception raised: {}",e.getMessage());
        }
        
        return cases;
    }
}

After making the Sybase call, this is the mess that dumps out on the creation of the SQL server datasource object.

2025-09-30 13:36:39:174 ERROR [main] (com.salientcrgt.chums.util.LogStandardOutput$2.print(LogStandardOutput.java:45)) serr: Exception in thread "main" 
2025-09-30 13:36:44:225 ERROR [main] (com.salientcrgt.chums.util.LogStandardOutput$2.print(LogStandardOutput.java:45)) serr: java.lang.NoClassDefFoundError: Could not initialize class sun.security.x509.OIDMap
2025-09-30 13:36:49:235 ERROR [main] (com.salientcrgt.chums.util.LogStandardOutput$2.print(LogStandardOutput.java:45)) serr:    at java.base/sun.security.x509.CertificateExtensions.parseExtension(CertificateExtensions.java:97)
2025-09-30 13:36:54:238 ERROR [main] (com.salientcrgt.chums.util.LogStandardOutput$2.print(LogStandardOutput.java:45)) serr:    at java.base/sun.security.x509.CertificateExtensions.init(CertificateExtensions.java:88)
2025-09-30 13:36:59:237 ERROR [main] (com.salientcrgt.chums.util.LogStandardOutput$2.print(LogStandardOutput.java:45)) serr:    at java.base/sun.security.x509.CertificateExtensions.<init>(CertificateExtensions.java:78)
2025-09-30 13:36:59:259 ERROR [main] (com.salientcrgt.chums.util.LogStandardOutput$2.print(LogStandardOutput.java:45)) serr:    at java.base/sun.security.x509.X509CertInfo.parse(X509CertInfo.java:709)
2025-09-30 13:37:04:247 ERROR [main] (com.salientcrgt.chums.util.LogStandardOutput$2.print(LogStandardOutput.java:45)) serr:    at java.base/sun.security.x509.X509CertInfo.<init>(X509CertInfo.java:169)
2025-09-30 13:37:04:266 ERROR [main] (com.salientcrgt.chums.util.LogStandardOutput$2.print(LogStandardOutput.java:45)) serr:    at java.base/sun.security.x509.X509CertImpl.parse(X509CertImpl.java:1787)
2025-09-30 13:37:09:256 ERROR [main] (com.salientcrgt.chums.util.LogStandardOutput$2.print(LogStandardOutput.java:45)) serr:    at java.base/sun.security.x509.X509CertImpl.<init>(X509CertImpl.java:178)
2025-09-30 13:37:09:284 ERROR [main] (com.salientcrgt.chums.util.LogStandardOutput$2.print(LogStandardOutput.java:45)) serr:    at java.base/sun.security.provider.X509Factory.engineGenerateCertificate(X509Factory.java:102)
2025-09-30 13:37:14:289 ERROR [main] (com.salientcrgt.chums.util.LogStandardOutput$2.print(LogStandardOutput.java:45)) serr:    at java.base/java.security.cert.CertificateFactory.generateCertificate(CertificateFactory.java:355)
2025-09-30 13:37:19:298 ERROR [main] (com.salientcrgt.chums.util.LogStandardOutput$2.print(LogStandardOutput.java:45)) serr:    at java.base/sun.security.pkcs.PKCS7.parseSignedData(PKCS7.java:305)
2025-09-30 13:37:24:302 ERROR [main] (com.salientcrgt.chums.util.LogStandardOutput$2.print(LogStandardOutput.java:45)) serr:    at java.base/sun.security.pkcs.PKCS7.parse(PKCS7.java:162)
2025-09-30 13:37:29:306 ERROR [main] (com.salientcrgt.chums.util.LogStandardOutput$2.print(LogStandardOutput.java:45)) serr:    at java.base/sun.security.pkcs.PKCS7.parse(PKCS7.java:126)
2025-09-30 13:37:34:295 ERROR [main] (com.salientcrgt.chums.util.LogStandardOutput$2.print(LogStandardOutput.java:45)) serr:    at java.base/sun.security.pkcs.PKCS7.<init>(PKCS7.java:108)
2025-09-30 13:37:34:322 ERROR [main] (com.salientcrgt.chums.util.LogStandardOutput$2.print(LogStandardOutput.java:45)) serr:    at java.base/sun.security.util.SignatureFileVerifier.<init>(SignatureFileVerifier.java:125)
2025-09-30 13:37:39:304 ERROR [main] (com.salientcrgt.chums.util.LogStandardOutput$2.print(LogStandardOutput.java:45)) serr:    at java.base/java.util.jar.JarVerifier.processEntry(JarVerifier.java:308)
2025-09-30 13:37:39:332 ERROR [main] (com.salientcrgt.chums.util.LogStandardOutput$2.print(LogStandardOutput.java:45)) serr:    at java.base/java.util.jar.JarVerifier.update(JarVerifier.java:239)
2025-09-30 13:37:44:342 ERROR [main] (com.salientcrgt.chums.util.LogStandardOutput$2.print(LogStandardOutput.java:45)) serr:    at java.base/java.util.jar.JarFile.initializeVerifier(JarFile.java:761)
2025-09-30 13:37:49:351 ERROR [main] (com.salientcrgt.chums.util.LogStandardOutput$2.print(LogStandardOutput.java:45)) serr:    at java.base/java.util.jar.JarFile.ensureInitialization(JarFile.java:1037)
2025-09-30 13:37:54:349 ERROR [main] (com.salientcrgt.chums.util.LogStandardOutput$2.print(LogStandardOutput.java:45)) serr:    at java.base/java.util.jar.JavaUtilJarAccessImpl.ensureInitialization(JavaUtilJarAccessImpl.java:72)
2025-09-30 13:37:54:370 ERROR [main] (com.salientcrgt.chums.util.LogStandardOutput$2.print(LogStandardOutput.java:45)) serr:    at java.base/jdk.internal.loader.URLClassPath$JarLoader$2.getManifest(URLClassPath.java:883)
2025-09-30 13:37:59:363 ERROR [main] (com.salientcrgt.chums.util.LogStandardOutput$2.print(LogStandardOutput.java:45)) serr:    at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:848)
2025-09-30 13:37:59:389 ERROR [main] (com.salientcrgt.chums.util.LogStandardOutput$2.print(LogStandardOutput.java:45)) serr:    at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:760)
2025-09-30 13:38:04:370 ERROR [main] (com.salientcrgt.chums.util.LogStandardOutput$2.print(LogStandardOutput.java:45)) serr:    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:681)
2025-09-30 13:38:04:396 ERROR [main] (com.salientcrgt.chums.util.LogStandardOutput$2.print(LogStandardOutput.java:45)) serr:    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:639)
2025-09-30 13:38:09:397 ERROR [main] (com.salientcrgt.chums.util.LogStandardOutput$2.print(LogStandardOutput.java:45)) serr:    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
2025-09-30 13:38:09:427 ERROR [main] (com.salientcrgt.chums.util.LogStandardOutput$2.print(LogStandardOutput.java:45)) serr:    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525)
2025-09-30 13:38:14:433 ERROR [main] (com.salientcrgt.chums.util.LogStandardOutput$2.print(LogStandardOutput.java:45)) serr:    at gov.usdohud.chums.GetCreditReports.getSQLCon(GetCreditReports.java:85)
2025-09-30 13:38:19:430 ERROR [main] (com.salientcrgt.chums.util.LogStandardOutput$2.print(LogStandardOutput.java:45)) serr:    at gov.usdohud.chums.GetCreditReports.main(GetCreditReports.java:54)

This is the SQL Server connection code.

    /**
     * Get SQL Server connection
     * @return
     * @throws InterruptedException 
     */
    private final Connection getSQLCon() {
        Connection conn = null;
        try {
            final SQLServerDataSource dataSource = new SQLServerDataSource();
            dataSource.setTrustServerCertificate(true);
            dataSource.setSendStringParametersAsUnicode(false);
            dataSource.setConnectRetryCount(5);
            dataSource.setServerName(config.getAusNatServer().getName());
            dataSource.setPortNumber(Integer.parseInt(config.getAusNatServer().getPort()));
            dataSource.setDatabaseName(config.getAusNatServer().getDatabase());
            dataSource.setUser(config.getAusNatServer().getUserId());
            dataSource.setPassword(config.getAusNatServer().getAuthentication());
            conn = dataSource.getConnection();
        } catch (SQLException e) {
            LOGGER.error("Unable to connect to aus_national :{}",e);
        } 
        return conn;
    }

I can comment out the call to the Sybase server and build a compatible LinkedHashSet and the program runs.

What do I need to do to get these drivers to work together?

5
  • This appears to be an issue with the certificate used to sign the SQL Server JDBC driver jar. I doubt this is related to having two JDBC drivers. What version of Java are you running with? Commented Sep 30 at 18:38
  • I wrote to you that there's some conflict between the two drivers, although i couldn't find the SO which was duplicate of this. Do you have some kind of magic going on when you're building? Commented Sep 30 at 18:44
  • Numerous people have mentioned that these two can be a problem together. I'm building with 17.0.11 and am not (knowingly) doing anything peculiar. I figure I need to make the Sybase environment go away once I'm done with it, but that doesn't seem straight forward to me. Commented Sep 30 at 19:30
  • Can you move them to seperate processes? i.e.: exchange data between them using IPC or some other sockets-based API? Commented Sep 30 at 21:09
  • @AlwaysLearning Can you provide a quick reference for that so I can determine if it is a good solution for my issue? Many Thanks! Commented Oct 1 at 10:00

1 Answer 1

0

I found the solution.

The SQL Server connection must be created prior to creating the Sybase Server connection.

Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.