0

I have a specific question about calling initializing JDBC and UCP connection into byndle activator. I created this activator:

public class Activator implements BundleActivator
{

    @Override
    public void start(BundleContext bc) throws Exception
    {

        testOracleUCP();
        System.out.println("Started module");
    }

    @Override
    public void stop(BundleContext bc) throws Exception
    {

    }

    public void testOracleUCP() throws Exception
    {
        System.out.println("Test Oracle UCP");
        Connection conn = null;
        try
        {
            conn = OracleDS_UCP.getConnection();
            OracleDS_UCP.getPoolDataSourceStatus();
        }
        catch (SQLException e)
        {
            throw e;
        }
        finally
        {
            if (conn != null)
                conn.close();
        }

    }
}

And I use this Java class to call initialize the connection:

public class OracleDS_UCP
{
    protected static final PoolDataSource pds;

    static
    {
        pds = initPoolDataSource();
    }

    public static Connection getConnection() throws SQLException
    {
        if (pds == null)
            return null;
        Connection conn = pds.getConnection();
        conn.setAutoCommit(false);
        return conn;
    }

    private static PoolDataSource initPoolDataSource()
    {
        try
        {
            System.out.println("\nStarting Oracle UCP Connection");
            PoolDataSource pool = PoolDataSourceFactory.getPoolDataSource();
            pool.setConnectionFactoryClassName("oracle.jdbc.pool.OracleDataSource");

            pool.setURL("jdbc:oracle:thin:@146.185.142.243:1521:XE");
            pool.setUser("SYSTEM");
            pool.setPassword("4r3e2w1q");

            //Setting pool properties (can be retrieved from config file)
            pool.setMaxStatements(10); // the maximum number of statements that may be pooled or cached on a connection.
            pool.setInitialPoolSize(2);
            pool.setMinPoolSize(1);
            pool.setMaxPoolSize(50);
            pool.setLoginTimeout(60); // one minute
            pool.setConnectionWaitTimeout(60); // one minute
            pool.setAbandonedConnectionTimeout(30 * 60); // thirty minutes
            pool.setMaxIdleTime(60 * 60); // one hour and kill inactive or idle connections
            pool.setInactiveConnectionTimeout(60 * 60); // one hour and kill inactive or idle connections
            pool.setConnectionWaitTimeout(0); // do not wait for a used connection to be released by a client.
            pool.setConnectionHarvestTriggerCount(40);
            pool.setConnectionHarvestMaxCount(10);

            return pool;
        }
        catch (SQLException ex)
        {
            Logger.getLogger(OracleDS_UCP.class.getName()).log(Level.SEVERE, null, ex);
        }

        return null;
    }
}

I embedded the JDBC driver and the ucp driver into the bundle:

<Embed-Dependency>ucp,ojdbc6;scope=compile|runtime</Embed-Dependency> 

And this is the manifest file of the bundle:

Manifest-Version: 1.0
Bnd-LastModified: 1387484566727
Build-Jdk: 1.8.0-ea
Built-By: developer
Bundle-Activator: org.project.osgi.SQLEngine.activator.Activator
Bundle-ClassPath: .,junit-4.11.jar,org.osgi.core-1.4.0.jar,org.osgi.comp
 endium-5.0.0.jar,ojdbc6-11.2.0.3.jar,ucp-11.2.0.3.jar,SQL_Exchanges-1.0
 .jar,Agents_Manager_api-2.0.jar
Bundle-ManifestVersion: 2
Bundle-Name: SQL_Engine
Bundle-SymbolicName: SQL_Engine
Bundle-Vendor: Corporation Name
Bundle-Version: 1.0.0
Created-By: Apache Maven Bundle Plugin
Embed-Dependency: *;scope=compile|runtime
Embedded-Artifacts: junit-4.11.jar;g="junit";a="junit";v="4.11",org.osgi
 .core-1.4.0.jar;g="org.apache.felix";a="org.osgi.core";v="1.4.0",org.os
 gi.compendium-5.0.0.jar;g="org.osgi";a="org.osgi.compendium";v="5.0.0",
 ojdbc6-11.2.0.3.jar;g="com.oracle";a="ojdbc6";v="11.2.0.3",ucp-11.2.0.3
 .jar;g="com.oracle";a="ucp";v="11.2.0.3",SQL_Exchanges-1.0.jar;g="SQL_E
 xchanges";a="SQL_Exchanges";v="1.0",Agents_Manager_api-2.0.jar;g="DX-57
 -Kernel";a="Agents_Manager_api";v="2.0"
Export-Package: org.project.osgi.SQLEngine.api;version="1.0.0"
Import-Package: org.osgi.framework;version="[1.5,2)",javax.sql.DataSourc
 e
Tool: Bnd-2.1.0.20130426-122213

And I get this error:

Caused by: java.lang.ClassNotFoundException: javax.sql.DataSource not found by S
QL_Engine [1147]

Any idea how I can fix this?

Peter Penzov
  • 1,126
  • 134
  • 430
  • 808

1 Answers1

1

The issue is that at the Import-Package: header javax.sql.DataSource is mentioned, but this is actually a class and not a package. Should be javax.sql. This was not done by the maven plugin, right?

  • `Import-Package` specifies the Java packages that a bundle uses so the OSGi framework knows how to wire the bundle at run-time. As such, all packages (apart from java.*) used by the bundle and not provided by the bundle should be mentioned there. Normally, the maven bnd plugin generates these imports automatically and since your MANIFEST indicates that it was generated by bnd/maven, I got the impression you used maven. But I absolutely do not believe that the plugin added javax.sql.DataSource (unless of course you have a package with that name, but that's unlikely). – Arie van Wijngaarden Dec 19 '13 at 20:57