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]
任何想法如何,我可以解決這個問題?
您能否提供更多信息?我不明白這一點? –
'Import-Package'指定包使用的Java包,所以OSGi框架知道如何在運行時連接包。因此,應該在那裏提到所有軟件包使用的軟件包(不包括java。*)。通常,maven bnd插件自動生成這些導入,因爲你的MANIFEST表明它是由bnd/maven生成的,所以我得到了你使用maven的印象。但我絕對不相信該插件添加了javax.sql.DataSource(除非你有一個包含該名稱的包,但這不太可能)。 –