You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@karaf.apache.org by "Iglehart, Vince" <Vi...@kniferiver.com> on 2018/03/27 16:39:15 UTC

Pax JDBC - JT400 Datasource

Hello,

I'm looking for help implementing a new Pax DataSourceFactory. I would like to use the JT400 JDBC driver to access DB2 on an AS400.  I created a datasource by implementing the org.osgi.service.jdbc.DataSourceFactory interface. I am using the following example:
http://liquid-reality.de:8090/display/liquid/2012/01/13/Apache+Karaf+Tutorial+Part+6+-+Database+Access

When I attempt to use the new datasource I get an error as follows:
karaf@root()> jdbc:query dsName "select count(*) from fnewtable"
Error executing command: The application requester cannot establish the connection. (Connection refused)

Here is what I've done so far.

  1.  Verified that XA/Pooling work correctly on a Weblogic app server.
  2.  Registered the JT400 driver by wrapping the jar file in a bundle.
  3.  Created a JT400DataSourceFactory class that implements the DataSourceFactory interface.
  4.  Registered the jar file which contains the data source factory implementation.  This was done by wrapping the jar file in a bundle.
  5.  Created a datasource cfg file and added it to the /etc folder.


I am using the following:
Open JDK 1.8
Karaf 4.1.4
JT Open 9.4
Linux - 3.8.13-44.1.1.el6uek.x86_64 GNU/Linux

Here is the code for my DataSourceFactory -

package kniferiver.utilities.jt400pax;

import java.sql.Driver;
import java.sql.SQLException;
import java.util.Properties;

import javax.sql.ConnectionPoolDataSource;
import javax.sql.DataSource;
import javax.sql.XADataSource;

import org.osgi.service.jdbc.DataSourceFactory;

public class JT400DataSourceFactory implements DataSourceFactory {

    private static final String DRIVER_FQCN = "com.ibm.as400.access.AS400JDBCDriver";
    private static final String DATASOURCE_FQCN = "com.ibm.as400.access.AS400JDBCDataSource";
    private static final String CONNECTIONPOOL_DATASOURCE_FQCN = "com.ibm.as400.access.AS400JDBCConnectionPoolDataSource";
    private static final String XA_DATASOURCE_FQCN = "com.ibm.as400.access.AS400JDBCXADataSource";

    private final Class<?> driverClass;
    private final Class<?> dataSourceClass;
    private final Class<?> connectionPoolDataSourceClass;
    private final Class<?> xADataSourceClass;

    public JT400DataSourceFactory() throws ClassNotFoundException {
        super();
        ClassLoader classLoader = this.getClass().getClassLoader();
        this.driverClass = classLoader.loadClass(DRIVER_FQCN);
        this.dataSourceClass = classLoader.loadClass(DATASOURCE_FQCN);
        this.connectionPoolDataSourceClass = classLoader
            .loadClass(CONNECTIONPOOL_DATASOURCE_FQCN);
        this.xADataSourceClass = classLoader.loadClass(XA_DATASOURCE_FQCN);
    }


    public DataSource createDataSource(Properties props) throws SQLException {
        try {
            return setProperties(dataSourceClass.newInstance(), props);
        }
        catch (Exception ex) {
            throw new SQLException(ex);
        }
    }


    public ConnectionPoolDataSource createConnectionPoolDataSource(Properties props)
        throws SQLException {
        try {
            return setProperties(connectionPoolDataSourceClass.newInstance(), props);
        }
        catch (Exception ex) {
            throw new SQLException(ex);
        }
    }

    public XADataSource createXADataSource(Properties props) throws SQLException {
        try {
            return setProperties(xADataSourceClass.newInstance(), props);
        }
        catch (Exception ex) {
            throw new SQLException(ex);
        }
    }


    public Driver createDriver(Properties props) throws SQLException {
        try {
            return Driver.class.cast(driverClass.newInstance());
        }
        catch (InstantiationException ex) {
            throw new SQLException(ex);
        }
        catch (IllegalAccessException ex) {
            throw new SQLException(ex);
        }
    }

    @SuppressWarnings("unchecked")
    private <T> T setProperties(Object dataSourceInstance, Properties props) throws Exception {

               setProperty("hostnamehere", dataSourceInstance, "setServerName");
               setProperty("toolbox trace=all;trace=true", dataSourceInstance, "setProperties");
        setProperty("useridhere", dataSourceInstance, "setUser");
        setProperty("passwordhere", dataSourceInstance,  "setPassword");

        return (T) dataSourceInstance;
    }

    private void setProperty(String value, Object instance, String methodName) throws Exception {
        if (value != null) {
            instance.getClass().getMethod(methodName, String.class).invoke(instance, value);
        }
    }
}


Here is the applicable stack trace:

ManagedConnection for handle: nullManagedConnectionInfo: org.apache.geronimo.connector.outbound.ManagedConnectionInfo@4110fb7a. mc: null]
javax.resource.spi.ResourceAdapterInternalException: Unable to obtain physical connection to
               at org.apache.aries.transaction.jdbc.internal.XADataSourceMCFFactory$XADataSourceMCF.getPhysicalConnection(XADataSourceMCFFactory.java:94) [298:org.ops4j.pax.jdbc.pool.aries:1.2.1]
               at org.apache.aries.transaction.jdbc.internal.XADataSourceMCFFactory$XADataSourceMCF.createManagedConnection(XADataSourceMCFFactory.java:67) [298:org.ops4j.pax.jdbc.pool.aries:1.2.1]
               at org.apache.geronimo.connector.outbound.MCFConnectionInterceptor.getConnection(MCFConnectionInterceptor.java:48) [294:org.apache.geronimo.components.geronimo-connector:3.1.1]
               at org.apache.geronimo.connector.outbound.XAResourceInsertionInterceptor.getConnection(XAResourceInsertionInterceptor.java:41) [294:org.apache.geronimo.components.geronimo-connector:3.1.1]
               at org.apache.geronimo.connector.outbound.SinglePoolConnectionInterceptor.internalGetConnection(SinglePoolConnectionInterceptor.java:70) [294:org.apache.geronimo.components.geronimo-connector:3.1.1]
               at org.apache.geronimo.connector.outbound.AbstractSinglePoolConnectionInterceptor.getConnection(AbstractSinglePoolConnectionInterceptor.java:80) [294:org.apache.geronimo.components.geronimo-connector:3.1.1]
               at org.apache.geronimo.connector.outbound.TransactionEnlistingInterceptor.getConnection(TransactionEnlistingInterceptor.java:49) [294:org.apache.geronimo.components.geronimo-connector:3.1.1]
               at org.apache.geronimo.connector.outbound.TransactionCachingInterceptor.getConnection(TransactionCachingInterceptor.java:109) [294:org.apache.geronimo.components.geronimo-connector:3.1.1]
               at org.apache.geronimo.connector.outbound.ConnectionHandleInterceptor.getConnection(ConnectionHandleInterceptor.java:43) [294:org.apache.geronimo.components.geronimo-connector:3.1.1]
               at org.apache.geronimo.connector.outbound.TCCLInterceptor.getConnection(TCCLInterceptor.java:39) [294:org.apache.geronimo.components.geronimo-connector:3.1.1]
               at org.apache.geronimo.connector.outbound.ConnectionTrackingInterceptor.getConnection(ConnectionTrackingInterceptor.java:66) [294:org.apache.geronimo.components.geronimo-connector:3.1.1]
               at org.apache.geronimo.connector.outbound.AbstractConnectionManager.allocateConnection(AbstractConnectionManager.java:81) [294:org.apache.geronimo.components.geronimo-connector:3.1.1]
               at org.tranql.connector.jdbc.TranqlDataSource.getConnection(TranqlDataSource.java:62) [298:org.ops4j.pax.jdbc.pool.aries:1.2.1]
               at org.apache.aries.transaction.jdbc.RecoverableDataSource.getConnection(RecoverableDataSource.java:249) [298:org.ops4j.pax.jdbc.pool.aries:1.2.1]
               at org.apache.karaf.jdbc.internal.JdbcConnector.connect(JdbcConnector.java:54) [233:org.apache.karaf.jdbc.core:4.1.4]
               at org.apache.karaf.jdbc.internal.JdbcConnector.createStatement(JdbcConnector.java:66) [233:org.apache.karaf.jdbc.core:4.1.4]
               at org.apache.karaf.jdbc.internal.JdbcServiceImpl.query(JdbcServiceImpl.java:124) [233:org.apache.karaf.jdbc.core:4.1.4]
               at org.apache.karaf.jdbc.command.QueryCommand.execute(QueryCommand.java:50) [233:org.apache.karaf.jdbc.core:4.1.4]
               at org.apache.karaf.shell.impl.action.command.ActionCommand.execute(ActionCommand.java:84) [43:org.apache.karaf.shell.core:4.1.4]
               at org.apache.karaf.shell.impl.console.osgi.secured.SecuredCommand.execute(SecuredCommand.java:68) [43:org.apache.karaf.shell.core:4.1.4]
               at org.apache.karaf.shell.impl.console.osgi.secured.SecuredCommand.execute(SecuredCommand.java:86) [43:org.apache.karaf.shell.core:4.1.4]
               at org.apache.felix.gogo.runtime.Closure.executeCmd(Closure.java:571) [43:org.apache.karaf.shell.core:4.1.4]
               at org.apache.felix.gogo.runtime.Closure.executeStatement(Closure.java:497) [43:org.apache.karaf.shell.core:4.1.4]
               at org.apache.felix.gogo.runtime.Closure.execute(Closure.java:386) [43:org.apache.karaf.shell.core:4.1.4]
               at org.apache.felix.gogo.runtime.Pipe.doCall(Pipe.java:417) [43:org.apache.karaf.shell.core:4.1.4]
               at org.apache.felix.gogo.runtime.Pipe.call(Pipe.java:229) [43:org.apache.karaf.shell.core:4.1.4]
               at org.apache.felix.gogo.runtime.Pipe.call(Pipe.java:59) [43:org.apache.karaf.shell.core:4.1.4]
               at java.util.concurrent.FutureTask.run(FutureTask.java:266) [?:?]
               at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [?:?]
               at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [?:?]
               at java.lang.Thread.run(Thread.java:745) [?:?]
Caused by: java.sql.SQLNonTransientConnectionException: The application requester cannot establish the connection. (Connection refused)
               at com.ibm.as400.access.JDError.createSQLExceptionSubClass(JDError.java:827) ~[?:?]
               at com.ibm.as400.access.JDError.throwSQLException(JDError.java:559) ~[?:?]
               at com.ibm.as400.access.AS400JDBCConnection.setProperties(AS400JDBCConnection.java:3391) ~[?:?]
               at com.ibm.as400.access.AS400JDBCDataSource.getConnection(AS400JDBCDataSource.java:706) ~[?:?]
               at com.ibm.as400.access.AS400JDBCDataSource.getConnection(AS400JDBCDataSource.java:679) ~[?:?]
               at com.ibm.as400.access.AS400JDBCXADataSource.getXAConnection(AS400JDBCXADataSource.java:146) ~[?:?]
               at org.apache.aries.transaction.jdbc.internal.XADataSourceMCFFactory$XADataSourceMCF.getPhysicalConnection(XADataSourceMCFFactory.java:89) ~[298:org.ops4j.pax.jdbc.pool.aries:1.2.1]
               ... 30 more
Caused by: java.net.ConnectException: Connection refused
               at java.net.PlainSocketImpl.socketConnect(Native Method) ~[?:?]
               at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) ~[?:?]
               at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) ~[?:?]
               at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) ~[?:?]
               at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[?:?]
               at java.net.Socket.connect(Socket.java:589) ~[?:?]
               at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?]
               at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:?]
               at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
               at java.lang.reflect.Method.invoke(Method.java:498) ~[?:?]
               at com.ibm.as400.access.PortMapper.getSocketConnection(PortMapper.java:260) ~[?:?]
               at com.ibm.as400.access.PortMapper.getServerSocket(PortMapper.java:161) ~[?:?]
               at com.ibm.as400.access.AS400ImplRemote.signonConnect(AS400ImplRemote.java:3181) ~[?:?]
               at com.ibm.as400.access.AS400ImplRemote.signon(AS400ImplRemote.java:2939) ~[?:?]
               at com.ibm.as400.access.AS400.sendSignonRequest(AS400.java:3357) ~[?:?]
               at com.ibm.as400.access.AS400.promptSignon(AS400.java:2944) ~[?:?]
               at com.ibm.as400.access.AS400.signon(AS400.java:4252) ~[?:?]
               at com.ibm.as400.access.AS400.connectService(AS400.java:1342) ~[?:?]
               at com.ibm.as400.access.AS400JDBCConnection.setProperties(AS400JDBCConnection.java:3383) ~[?:?]
               at com.ibm.as400.access.AS400JDBCDataSource.getConnection(AS400JDBCDataSource.java:706) ~[?:?]
               at com.ibm.as400.access.AS400JDBCDataSource.getConnection(AS400JDBCDataSource.java:679) ~[?:?]
               at com.ibm.as400.access.AS400JDBCXADataSource.getXAConnection(AS400JDBCXADataSource.java:146) ~[?:?]
               at org.apache.aries.transaction.jdbc.internal.XADataSourceMCFFactory$XADataSourceMCF.getPhysicalConnection(XADataSourceMCFFactory.java:89) ~[298:org.ops4j.pax.jdbc.pool.aries:1.2.1]
               ... 30 more
2018-03-27T11:19:23,079 | ERROR | Karaf local console user karaf | ShellUtil                        | 43 - org.apache.karaf.shell.core - 4.1.4 | Exception caught while executing command
java.sql.SQLNonTransientConnectionException: The application requester cannot establish the connection. (Connection refused)
               at com.ibm.as400.access.JDError.createSQLExceptionSubClass(JDError.java:827) [256:DB2-JDBC-Driver:0.0.0]
               at com.ibm.as400.access.JDError.throwSQLException(JDError.java:559) [256:DB2-JDBC-Driver:0.0.0]
               at com.ibm.as400.access.AS400JDBCConnection.setProperties(AS400JDBCConnection.java:3391) [256:DB2-JDBC-Driver:0.0.0]
               at com.ibm.as400.access.AS400JDBCDataSource.getConnection(AS400JDBCDataSource.java:706) [256:DB2-JDBC-Driver:0.0.0]
               at com.ibm.as400.access.AS400JDBCDataSource.getConnection(AS400JDBCDataSource.java:679) [256:DB2-JDBC-Driver:0.0.0]
               at com.ibm.as400.access.AS400JDBCXADataSource.getXAConnection(AS400JDBCXADataSource.java:146) [256:DB2-JDBC-Driver:0.0.0]
               at org.apache.aries.transaction.jdbc.internal.XADataSourceMCFFactory$XADataSourceMCF.getPhysicalConnection(XADataSourceMCFFactory.java:89) [298:org.ops4j.pax.jdbc.pool.aries:1.2.1]
               at org.apache.aries.transaction.jdbc.internal.XADataSourceMCFFactory$XADataSourceMCF.createManagedConnection(XADataSourceMCFFactory.java:67) [298:org.ops4j.pax.jdbc.pool.aries:1.2.1]
               at org.apache.geronimo.connector.outbound.MCFConnectionInterceptor.getConnection(MCFConnectionInterceptor.java:48) [294:org.apache.geronimo.components.geronimo-connector:3.1.1]
               at org.apache.geronimo.connector.outbound.XAResourceInsertionInterceptor.getConnection(XAResourceInsertionInterceptor.java:41) [294:org.apache.geronimo.components.geronimo-connector:3.1.1]
               at org.apache.geronimo.connector.outbound.SinglePoolConnectionInterceptor.internalGetConnection(SinglePoolConnectionInterceptor.java:70) [294:org.apache.geronimo.components.geronimo-connector:3.1.1]
               at org.apache.geronimo.connector.outbound.AbstractSinglePoolConnectionInterceptor.getConnection(AbstractSinglePoolConnectionInterceptor.java:80) [294:org.apache.geronimo.components.geronimo-connector:3.1.1]
               at org.apache.geronimo.connector.outbound.TransactionEnlistingInterceptor.getConnection(TransactionEnlistingInterceptor.java:49) [294:org.apache.geronimo.components.geronimo-connector:3.1.1]
               at org.apache.geronimo.connector.outbound.TransactionCachingInterceptor.getConnection(TransactionCachingInterceptor.java:109) [294:org.apache.geronimo.components.geronimo-connector:3.1.1]
               at org.apache.geronimo.connector.outbound.ConnectionHandleInterceptor.getConnection(ConnectionHandleInterceptor.java:43) [294:org.apache.geronimo.components.geronimo-connector:3.1.1]
               at org.apache.geronimo.connector.outbound.TCCLInterceptor.getConnection(TCCLInterceptor.java:39) [294:org.apache.geronimo.components.geronimo-connector:3.1.1]
               at org.apache.geronimo.connector.outbound.ConnectionTrackingInterceptor.getConnection(ConnectionTrackingInterceptor.java:66) [294:org.apache.geronimo.components.geronimo-connector:3.1.1]
               at org.apache.geronimo.connector.outbound.AbstractConnectionManager.allocateConnection(AbstractConnectionManager.java:81) [294:org.apache.geronimo.components.geronimo-connector:3.1.1]
               at org.tranql.connector.jdbc.TranqlDataSource.getConnection(TranqlDataSource.java:62) [298:org.ops4j.pax.jdbc.pool.aries:1.2.1]
               at org.apache.aries.transaction.jdbc.RecoverableDataSource.getConnection(RecoverableDataSource.java:249) [298:org.ops4j.pax.jdbc.pool.aries:1.2.1]
               at org.apache.karaf.jdbc.internal.JdbcConnector.connect(JdbcConnector.java:54) [233:org.apache.karaf.jdbc.core:4.1.4]
               at org.apache.karaf.jdbc.internal.JdbcConnector.createStatement(JdbcConnector.java:66) [233:org.apache.karaf.jdbc.core:4.1.4]
               at org.apache.karaf.jdbc.internal.JdbcServiceImpl.query(JdbcServiceImpl.java:124) [233:org.apache.karaf.jdbc.core:4.1.4]
               at org.apache.karaf.jdbc.command.QueryCommand.execute(QueryCommand.java:50) [233:org.apache.karaf.jdbc.core:4.1.4]
               at org.apache.karaf.shell.impl.action.command.ActionCommand.execute(ActionCommand.java:84) [43:org.apache.karaf.shell.core:4.1.4]
               at org.apache.karaf.shell.impl.console.osgi.secured.SecuredCommand.execute(SecuredCommand.java:68) [43:org.apache.karaf.shell.core:4.1.4]
               at org.apache.karaf.shell.impl.console.osgi.secured.SecuredCommand.execute(SecuredCommand.java:86) [43:org.apache.karaf.shell.core:4.1.4]
               at org.apache.felix.gogo.runtime.Closure.executeCmd(Closure.java:571) [43:org.apache.karaf.shell.core:4.1.4]
               at org.apache.felix.gogo.runtime.Closure.executeStatement(Closure.java:497) [43:org.apache.karaf.shell.core:4.1.4]
               at org.apache.felix.gogo.runtime.Closure.execute(Closure.java:386) [43:org.apache.karaf.shell.core:4.1.4]
               at org.apache.felix.gogo.runtime.Pipe.doCall(Pipe.java:417) [43:org.apache.karaf.shell.core:4.1.4]
               at org.apache.felix.gogo.runtime.Pipe.call(Pipe.java:229) [43:org.apache.karaf.shell.core:4.1.4]
               at org.apache.felix.gogo.runtime.Pipe.call(Pipe.java:59) [43:org.apache.karaf.shell.core:4.1.4]
               at java.util.concurrent.FutureTask.run(FutureTask.java:266) [?:?]
               at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [?:?]
               at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [?:?]
               at java.lang.Thread.run(Thread.java:745) [?:?]
Caused by: java.net.ConnectException: Connection refused
               at java.net.PlainSocketImpl.socketConnect(Native Method) ~[?:?]
               at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) ~[?:?]
               at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) ~[?:?]
               at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) ~[?:?]
               at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[?:?]
               at java.net.Socket.connect(Socket.java:589) ~[?:?]
               at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?]
               at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:?]
               at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
               at java.lang.reflect.Method.invoke(Method.java:498) ~[?:?]
               at com.ibm.as400.access.PortMapper.getSocketConnection(PortMapper.java:260) ~[?:?]
               at com.ibm.as400.access.PortMapper.getServerSocket(PortMapper.java:161) ~[?:?]
               at com.ibm.as400.access.AS400ImplRemote.signonConnect(AS400ImplRemote.java:3181) ~[?:?]
               at com.ibm.as400.access.AS400ImplRemote.signon(AS400ImplRemote.java:2939) ~[?:?]
               at com.ibm.as400.access.AS400.sendSignonRequest(AS400.java:3357) ~[?:?]
               at com.ibm.as400.access.AS400.promptSignon(AS400.java:2944) ~[?:?]
               at com.ibm.as400.access.AS400.signon(AS400.java:4252) ~[?:?]
               at com.ibm.as400.access.AS400.connectService(AS400.java:1342) ~[?:?]
               at com.ibm.as400.access.AS400JDBCConnection.setProperties(AS400JDBCConnection.java:3383) ~[?:?]

Thanks in advance.

Vince Iglehart
Business Applications Developer
Phone: (701) 530-1416
vince.iglehart@kniferiver.com<ma...@kniferiver.com>

[cid:image002.png@01D3C5C0.3BC4EAF0]