从OSGI bundle调用JDBC和UCP连接

时间:2013-12-19 20:42:18

标签: java osgi apache-felix osgi-bundle

我有一个关于调用JDBC和UCP连接到byndle激活器的特定问题。我创建了这个激活器:

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();
        }

    }
}

我使用这个Java类来调用初始化连接:

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;
    }
}

我将JDBC驱动程序和ucp驱动程序嵌入到包中:

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

这是捆绑包的清单文件:

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

我收到了这个错误:

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

知道如何解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

问题在于提到了Import-Package:标题javax.sql.DataSource,但这实际上是一个类而不是包。应该是javax.sql。这不是由maven插件完成的,对吗?