2013-12-19 76 views
0

我有一個關於調用初始化JDBC和UCP連接到byndle激活器的具體問題。我創造了這個激活:從OSGI包調用JDBC和UCP連接

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

問題是,在Import-Package:標題javax.sql.DataSource被提及,但這實際上是一個類而不是一個包。應該是javax.sql。這不是由maven插件完成的,對吧?

+0

您能否提供更多信息?我不明白這一點? –

+0

'Import-Package'指定包使用的Java包,所以OSGi框架知道如何在運行時連接包。因此,應該在那裏提到所有軟件包使用的軟件包(不包括java。*)。通常,maven bnd插件自動生成這些導入,因爲你的MANIFEST表明它是由bnd/maven生成的,所以我得到了你使用maven的印象。但我絕對不相信該插件添加了javax.sql.DataSource(除非你有一個包含該名稱的包,但這不太可能)。 –